我是經過長時間搜索後發現的第一篇文章,但尚未得到有關此問題的答案,請在此問題上提供幫助。無法在Process.Runtime.exec語句行之前執行任何操作
我正在使用Netbean 6.9.1來構建一個Java應用程序,它可以大量調用幾個不同的外部程序,因此我使用了進程和運行時函數來調用外部程序。
整個申請過程分爲幾個階段,我想告訴直到其現階段的應用,目前通過更新GUI的textarea運行的用戶,代碼顯示如下:
公共無效executeCommand(字符串CMD,文件路徑) {
try
{
****areaOutput.setText("Executing audio decoding, please wait till process is done\n");****
btnTranscribe.setEnabled(false);
areaOutput.setEditable(false);
areaOutput.setEnabled(false);
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);
areaOutput.append("\n\nConversion is done, processing with features extraction....");
} catch (Throwable t)
{
t.printStackTrace();
}
}
由於顯示在上面的代碼,我想設置多行文本和執行命令前禁用某些按鍵,但是當應用程序運行,所有這些線似乎無法工作並且在命令完成exe之前,應用程序本身沒有任何變化cuted,運行預命令代碼的任何解決方案在.exec()開始運行之前首先執行?
我很感謝您對此問題的大力幫助和建議。
最好的問候, Striky
P/S:
您好,我有彌補這方面的CmdExec一個Thread類,以便在不同的線程來執行CMD:
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();
}
} }
並且爲了呼叫此類,
CmdExec tryDemo = new CmdExec(); tryDemo = new CmdExec(strSegment,fSegment); tryDemo.run(); 是用來啓動線程,但我沒有把SwingUtilities.invokeLater放在這些進程的任何部分,它根本就不會運行tryDemo.run(),因爲它是無效的...
另外,可能我到目前爲止我知道我在做什麼?非常感謝你對你的幫助就這個問題
P/S 2:我剛纔添加另一種可運行的代碼(所以執行過程線程,可運行於GUI更新)爲如下GUI更新命令:
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"); }
};
和我處理的運行如下之前使用SwingUtilies.invokeLater:
SwingUtilities.invokeLater(doWorkRunnable);
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
但所有這些失敗,我是得到了GUI和進程線程協調順序不對?
所以你的意思是基本上我需要創建一個線程並將此execute方法放入線程中? – striky 2011-03-31 19:20:37
差不多。只有進程啓動和處理進入另一個線程。那麼你使用SwingUtilities.invokeLater方法與EDT線程交互(其他線程可能不直接與gui交互)。 – jtahlborn 2011-03-31 23:44:59
hihi,我已經爲所有這個CmdExec過程做了一個線程,我已經把最新的代碼放在主要內容的頂部,並且爲了調用這個類, CmdExec tryDemo = new CmdExec(); tryDemo = new CmdExec(strSegment,fSegment); tryDemo.run(); 用於啓動線程,但我沒有把SwingUtilities.invokeLater放在這些進程的任何部分,它不會運行tryDemo.run(),因爲它是無效的... 另外,我可否知道到目前爲止,我做對了嗎?非常感謝你對這個問題的友好幫助 – striky 2011-04-01 09:54:06