2011-03-31 117 views
0

我是經過長時間搜索後發現的第一篇文章,但尚未得到有關此問題的答案,請在此問題上提供幫助。無法在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和進程線程協調順序不對?

回答

2

您正在EDT(更新gui的線程)上執行此項工作。所以,在所有這些工作完成之前,gui不能更新。你想要做的是運行一個單獨的線程,它執行所有的工作並定期調用SwingUtilities.invokeLater並進行狀態更新。

+0

所以你的意思是基本上我需要創建一個線程並將此execute方法放入線程中? – striky 2011-03-31 19:20:37

+0

差不多。只有進程啓動和處理進入另一個線程。那麼你使用SwingUtilities.invokeLater方法與EDT線程交互(其他線程可能不直接與gui交互)。 – jtahlborn 2011-03-31 23:44:59

+0

hihi,我已經爲所有這個CmdExec過程做了一個線程,我已經把最新的代碼放在主要內容的頂部,並且爲了調用這個類, CmdExec tryDemo = new CmdExec(); tryDemo = new CmdExec(strSegment,fSegment); tryDemo.run(); 用於啓動線程,但我沒有把SwingUtilities.invokeLater放在這些進程的任何部分,它不會運行tryDemo.run(),因爲它是無效的... 另外,我可否知道到目前爲止,我做對了嗎?非常感謝你對這個問題的友好幫助 – striky 2011-04-01 09:54:06

0

嘗試在執行方法之前進行睡眠。驗證發生了什麼。

+0

您好,謝謝答覆=)。我已經把Thread.sleep放在execute方法的前面,但是GUI仍然沒有更新>。< – striky 2011-03-31 19:18:05

相關問題