Java GUI在执行进程时无法更新(SwingUtilities.invokeLater)
关于上一个问题,我已将代码更改为两部分,一个线程类CmdExec,它包含执行外部程序的所有代码,如下所示:Java GUI在执行进程时无法更新(SwingUtilities.invokeLater),java,process,runtime.exec,swingutilities,Java,Process,Runtime.exec,Swingutilities,关于上一个问题,我已将代码更改为两部分,一个线程类CmdExec,它包含执行外部程序的所有代码,如下所示: public class CmdExec extends Thread { private String cmd; private File path; public CmdExec() { } public CmdExec(String cmd, File path) { this.cmd = cm
public class CmdExec extends Thread
{
private String cmd;
private File path;
public CmdExec() {
}
public CmdExec(String cmd, File path) {
this.cmd = cmd;
this.path = path;
}
public void run(){
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
Runnable doWorkRunnable = new Runnable() {
public void run() {
System.out.println("hello world");
btnTranscribe.setEnabled(false);
areaOutput.setEditable(false);
areaOutput.setEnabled(false);
areaOutput.setText("Performing segmentation, please wait till process is done\n"); }
};
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
strSegment = "java -Xmx2024m -jar ./LIUM_SpkDiarization-4.2.jar / --fInputMask=" + strAudioOut + "/%s.wav"
+ " --sOutputMask=" + strCtlOut + "/%s.ctl --sOutputFormat=ctl -- doCEClustering --cMinimumOfCluster=1 new3_20110331103858";
CmdExec tryDemo = new CmdExec();
tryDemo = new CmdExec(strSegment, fSegment);
tryDemo.run();
strExtract = "./sphinx_fe -i " + strAudioOut + "/new3_20110331103858.wav"
+ " -o " + strFeatureOut + "/new3_20110331103858.mfc";
//System.out.println (strExtract);
//executeCommand (strExtract, fExtract);
tryDemo = new CmdExec(strExtract, fExtract);
tryDemo.run();
}
在实际运行process.exec()调用外部程序之前,我调用SwingUtilities.invokeLater来更改GUI,如下所示:
SwingUtilities.invokeLater(doWorkRunnable);
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
但是对于上面的所有代码,GUI仍然无法更新,只有在完成该过程后才会更新。在协调这两个可运行和可运行线程的任何特定步骤上,我都错了吗
提前感谢您的帮助和回答
p/S:GUI中按下按钮时,我开始执行CmdExec(),如下所示:
public class CmdExec extends Thread
{
private String cmd;
private File path;
public CmdExec() {
}
public CmdExec(String cmd, File path) {
this.cmd = cmd;
this.path = path;
}
public void run(){
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
Runnable doWorkRunnable = new Runnable() {
public void run() {
System.out.println("hello world");
btnTranscribe.setEnabled(false);
areaOutput.setEditable(false);
areaOutput.setEnabled(false);
areaOutput.setText("Performing segmentation, please wait till process is done\n"); }
};
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
strSegment = "java -Xmx2024m -jar ./LIUM_SpkDiarization-4.2.jar / --fInputMask=" + strAudioOut + "/%s.wav"
+ " --sOutputMask=" + strCtlOut + "/%s.ctl --sOutputFormat=ctl -- doCEClustering --cMinimumOfCluster=1 new3_20110331103858";
CmdExec tryDemo = new CmdExec();
tryDemo = new CmdExec(strSegment, fSegment);
tryDemo.run();
strExtract = "./sphinx_fe -i " + strAudioOut + "/new3_20110331103858.wav"
+ " -o " + strFeatureOut + "/new3_20110331103858.mfc";
//System.out.println (strExtract);
//executeCommand (strExtract, fExtract);
tryDemo = new CmdExec(strExtract, fExtract);
tryDemo.run();
}
您需要调用tryDemo.start(),而不是tryDemo.run()。您正在直接运行线程,而不是生成单独的调用。您能显示启动CmdExec线程的代码吗?嗨,jtahlborn,我在上面的主要内容中附加了代码n,这是GUI中按下按钮时触发的事件,谢谢=)哦,我有多傻,jtahlborn你帮了我一天,我真的很感激你从一开始到现在的帮助,真的非常感谢你!!!!!