0

Unable to perform any action before Process.Runtime.exec statement lineでの以前の質問を参照して、コードを 2 つの部分に変更しました。以下のように、外部プログラムを実行するためのすべてのコードを持つスレッド クラス 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();
      }

また、jtahlborn の回答を参照して、以下のように、GUI 更新の目的で別の Runnable クラスも作成しました。

       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"); }
        };

以下に示すように、実際に process.exec() を実行して外部プログラムを呼び出す前に、SwingUtilities.invokeLater を呼び出して GUI を変更します。

    SwingUtilities.invokeLater(doWorkRunnable);
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(cmd , null, path);

しかし、上記のすべてのコードを使用しても、GUI は更新に失敗し、プロセスが完了した後にのみ更新されます。これらの 2 つの実行可能スレッドとスレッドを調整する特定のステップで間違っているのでしょうか?

あなたの大きな助けと答えを前もって感謝します

P / S:以下のようにGUIでボタンが押されている間にCmdExec()の実行を開始します:

    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();
      }
4

1 に答える 1

0

tryDemo.run() ではなく、tryDemo.start() を呼び出す必要があります。別の呼び出しを生成するのではなく、スレッドを直接実行しています。

于 2011-04-01T12:35:41.237 に答える