【问题标题】:get immediately systemoutput while runtime (updating ProgressBar) Java在运行时立即获取系统输出(更新 ProgressBar)Java
【发布时间】:2013-03-07 22:15:12
【问题描述】:

我正在通过 runtime.exec 运行一个命令,这需要一些时间。我想在此期间更新我的 ProgressBar。
我已经得到了我想要的系统输出,问题是:当进程完成时,我立刻得到了它。而不是一步步更新我的ProgressBar ...

这是一些代码

public Runtime rt = Runtime.getRuntime();
public Process pp;

  public doit() {
      try {
          pp = rt.exec(a_long_timed_process);
          InputStream is = pp.getErrorStream();
          InputStreamReader isr = new InputStreamReader(is);
          BufferedReader br = new BufferedReader(isr);
          String line = null;
          while ((line = br.readLine()) != null) {
              if (line.contains("In:")) {
                  int a = line.indexOf("In:");              //get a string
                  int b = line.lastIndexOf("%");            //between 
                  String lineout = line.substring(a + 3, b);//"0.00" and "99.99"
                  double nr = Double.parseDouble(lineout);  //make it a double
                  int round = (int) nr;                     //make it a usable int
                  System.out.println(round);
                  myProgressBar.setValue(round);            //UPDATE Progressbar
              }
          }
          pp.waitFor();
      } catch (IOException ex) {
          Logger.getLogger(Sox.class.getName()).log(Level.SEVERE, null, ex);
      } catch (InterruptedException ex) {
          Logger.getLogger(Sox.class.getName()).log(Level.SEVERE, null, ex);
      }
  }

感谢所有帮助
提前致谢

【问题讨论】:

  • 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用Thread.sleep(n) 实现一个Swing Timer 用于重复任务或SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing

标签: java swing concurrency event-dispatch-thread jprogressbar


【解决方案1】:

如果您希望能够同时处理其输出,则必须在不同的线程中运行该进程。一个好方法是使用ProcessBuilder

来自文档:

该类用于创建操作系统进程。

[...]

启动一个使用默认工作目录的新进程,并且 环境简单:

Process p = new ProcessBuilder("myCommand", "myArg").start();

这是一个使用修改后的工作启动进程的示例 目录和环境,并将标准输出和错误重定向到 附加到日志文件中:

ProcessBuilder pb =
  new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory(new File("myDir"));
File log = new File("log");
pb.redirectErrorStream(true);
pb.redirectOutput(Redirect.appendTo(log));
Process p = pb.start();
assert pb.redirectInput() == Redirect.PIPE;
assert pb.redirectOutput().file() == log;
assert p.getInputStream().read() == -1;

另请参阅 here 以了解您可以根据需要进行调整的另一个代码示例。

【讨论】:

    【解决方案2】:

    您在启动的过程中看到了输出缓冲的效果。在 Java 代码中您无能为力。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2020-10-02
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多