- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 Java Swing 创建了一个桌面应用程序。它需要用户的一些输入,创建一个配置文件和一个批处理文件来运行 python 脚本。许多担忧是:
- 当批处理文件执行正在进行时,我希望 GUI 处于 Activity 模式
- 应用程序中有一个类似 ShowLog 的按钮,用于在执行过程中检查控制台输出。这应该可以在点击时起作用
- 我在 GUI 中有一条“任务进行中”消息,当批处理文件执行完成时,该消息应替换为“任务已完成”
- 还有一个“停止”按钮可以强制停止批处理文件的执行。这应该也能正常工作
(注意:批处理文件执行将需要数小时才能完成)
任何人都可以提出一些想法,让我实现所有这些目标吗?
最佳答案
正如您所知,Swing 是一个单线程框架,这意味着在事件调度线程上下文中运行的任何内容都将阻止它更新屏幕或响应用户输入。
基本的解决方案是使用 Thread
来运行批处理,但这会引发 UI 更新同步问题,因为您永远不应该从外部修改 UI 或与 UI 交互EDT 的背景。
更好的解决方案是使用 SwingWorker
,它使您能够在后台运行长时间运行的任务,同时还使您能够发布
在 EDT 上下文中更新并处理
更新,它还为您提供了 done
方法,该方法在 doInBackground
方法退出后调用,并且在 EDT 上下文中调用。
最后,它为您提供了一个取消
选项 - 但这就是问题发生的地方。据推测,您将在辅助线程中读取进程的输入,并等待
进程在您启动它的同一线程 (SwingWorker
) 中退出。 SwingWorker
依赖于 Thread
的中断
功能,它可能不会触发 waitFor
方法返回。
现在阅读了 Process
文档,waitFor
确实抛出了 InterruptedException
if the current thread is interrupted by another thread while it is waiting, then the wait is ended and an InterruptedException is thrown.
这表明当调用 done
时,您需要调用 isCancelled
来检查工作线程是否被取消。如果是这样,您需要在Process
上调用destroy
并关闭您可能正在运行的任何辅助Thread
。
您可以使用额外的 SwingWorker
来读取流程中的输入,并利用其publish
/process
功能来更新日志。
这意味着,您将启动一个 SwingWorker
来执行您的外部进程。这可能是为了响应某些事件(例如按下按钮)而完成的。
当调用此工作线程的 doInBackground
方法时,它将执行外部进程并调用 Process#waitFor
。这将阻止 doInBackground
方法返回,直到进程退出。
在调用 Process#waitFor
之前,您可以创建另一个 SwingWorker
并传递 Process
的 OutputStream
到它。这将允许该工作人员独立处理流程的输出。然后,您可以使用它通过 SwingWorker
的 publish
/process
功能将流程的输出发送回 EDT,这可以添加到诸如 JTextArea
之类的内容中。
这将为您在处理 SwingUtilities.invokeLater
时省去很多麻烦。
需要第二部作品吗?这取决于您希望 worker 做什么。我倾向于在单独的线程中处理外部进程的所有输出,并允许创建该进程的人使用 waitFor
,它进一步隔离了责任,并防止 IO 被锁定而永远无法到达 waitFor
,但这只是我。
看看Concurrency in Swing了解更多详情
关于java - 从 Java GUI 应用程序启动 Windows 批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21872242/
我正在尝试制作一个基于文本的批处理游戏。但是我刚开始写我以前从未遇到过的问题时遇到了一个问题。 :menu :: the game menu - opens when the game starts
我正在构建一个社交媒体应用程序,用户需要发布一些内容,然后将发布的内容传播给他/她的 4 个圈子内的所有成员。这意味着查询进入循环。它就像一个家谱。逻辑工作得很好。但现在,当每个圈子中的成员数量不断增
1. DECLARE TYPE ref_cursor_type IS ref CURSOR; v_mycursor ref_cursor_type;
我想在这里做的是循环直到按下“x”。我知道 CHOICE 带有 /T 选项。 但是 CHOICE 对我要播放的动画的超时时间太长。这是一个例子: @echo off cls set frame=2 :
我已经寻找解决方案,但我仍然遇到问题。我有两个文件: File1.txt 1111 2222 3333 File2.txt 1111 2222 3333 4444 我想要一个只有差异的输
我正在做一个批处理脚本,必须检查计算机上是否安装了一些程序。为此,我执行 programName --version我将输出存储在一个变量中。问题是当我尝试与正则表达式进行比较时(只知道该程序是否存在
我知道如何从同一个批处理文件中的函数返回值,但我发现从不同的批处理文件返回值时存在一些问题。下面是一个例子: 文件 1.cmd SETLOCAL ENABLEEXTENSIONS SETLOCAL E
我相信这个问题的答案应该很简单。我从一个地方获取目录列表并将它们存储到文本文档中。然后我读取文本文档名称并将它们存储到一个数组中。在此过程结束时,我希望删除数组中的所有条目。 我想这样做的原因是因为我
我家有两个摄像头,几乎每天都在创建图像。他们将它们保存到我的FTP服务器(Fritz.Box\Nas驱动器)。 文件夹结构如下: +-2016-08-24 +-+Subfolder +----+Ano
在Windows Batch中执行此操作。我有一个名称列表,并要求用户输入其名称。 我想检查该名称是否已经存在于列表中,如果存在,则直接进入goto,否则它将名称添加到列表中。 @echo off s
我正在编写一个批处理文件,我想运行一个 for 循环,将它的第一个值设置为一个变量。我只需要命令的第一个值,但我找不到另一种方法来做到这一点。我设置它的方式是使用一个 for 循环,然后是一个 do
我需要创建一个批处理文件,使用tracert命令跟踪一些IP,并将跟踪写入txt文件。我希望它很快,所以我想为每个跟踪启动一个新命令,以使所有跟踪请求立即启动。 这是我的 ping.bat: @ech
我想在批处理文件中使用PowerShell命令发送电子邮件。为此,我实现了一个名为 sendMail 的函数。我这样称呼它: setlocal enabledelayedexpansion call:
想要使用 java 执行 selenium 脚本/批处理脚本。根据输入参数调用脚本/批处理脚本。 了解如何使用 java 代码运行脚本/批处理。 请帮帮我。 最佳答案 要运行 java 项目中文件中包
我正在练习 JDBC 批处理并遇到错误: 错误1:不支持的功能错误2:执行不能为空或为null Property files include: itemsdao.updateBookName = Up
我从 json 文件中得到了以下字符串: 39468856, 现在,我想用这些数字进行计算..因此,我必须删除末尾的 , 。 此时我使用以下代码: for /f "skip=24 tokens=2"
我有一堆 SQL 查询作为文件存储在磁盘上。 它们都是纯 SELECT 查询,换句话说,它们只做读操作。 我正在连接到 Oracle 11g 数据库,我想测量所有这些查询的大致执行时间。有没有办法以编
我正在使用 java 来存储属性文件的目录路径。 然后在 bat 文件中我使用属性作为变量。 问题出在 Java 中,文件路径存储为 SOME_VAR=D\:\\Madhan\\Program Fil
我想用“%”替换字符串中的“mod”:set string=%string:mod=x%我应该输入什么作为“x”? 最佳答案 您可以通过启用延迟扩展来做到这一点,以便您可以使用 !作为分隔符。然后,将
在我目前正在处理的批处理文件中,我遇到了一个小问题。我有一个名为 Dimensions(number from 1-5, defined in a for /l loop).txt 的文件,其中包含
我是一名优秀的程序员,十分优秀!