0

我有一个运行很长时间的 c++ 应用程序,我想跟踪它的进度。我在 java 中有这个应用程序的用户界面。谁能告诉我如何使用 JProgressBar 跟踪本机应用程序的进度。我的本机应用程序在完成后返回一个整数,并且我有一个“完成”按钮,当返回这个整数时会显示。但是我想要一个进度条来显示本机应用程序正在运行。

4

3 回答 3

4

唯一的方法是在 java 中创建回调(意味着 c++ 中的代码将调用 java 函数)以通知当前进度或创建 java 代码调用的函数以获取任务的当前进度。

http://www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI

然后,java 代码将使用该值来更新 jprogress 栏。

于 2013-08-20T15:44:25.877 回答
2

Adam 的另一个可能更简单的解决方案是让您的 C++ 程序将进度更新输出到标准输出,可能是进度百分比的字符串表示。然后,Java 程序的 Process 将通过在 Swing 线程的线程背景中调用getInputStream()Process(是的,这不是拼写错误;它是)来监视其 OutputStream,并使用该信息来更新 JProgressBar。getInputStream()

于 2013-08-20T16:08:13.697 回答
1

正如其他人所说,您需要有一种方法让您的 java 应用程序知道您的 c++ 应用程序有多孤独。

如果您想要快速修复,请使用 JProgressBar 并将其设置为 interdeminate。它会为栏设置动画,向您展示正在发生的事情。一旦您的流程返回,将栏设置为 100%。

简单的方法:

ProcessBuilder processBuilder = new ProcessBuilder(command);
JProgressBar progressBar = new JProgressBar();
progressBar.setIndeterminate(true);
Process p = processBuilder.start();

p.waitFor();
progressBar.setIndeterminate(false);
progressBar.setValue(progressBar.getMaxValue());

更好的方法:

ProcessBuilder processBuilder = new ProcessBuilder(command);
JProgressBar progressBar = new JProgressBar();

processBuilder.redirectErrorStream(true);
Process p = processBuilder.start();
InputStream is = p.getInputStream();
try {
    in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    while ((line = in.readLine()) != null) {
        //error checking
       int progressValue = Integer.parseInt(line);
      progressBar.setValue(progressValue);
    } finally {
       in.close();
    }
}
progressBar.setValue(progressBar.getMaxValue());
于 2013-08-20T17:31:27.790 回答