JProgressBar使用JNI跟踪Native(C ++)应用程序

时间:2013-08-20 15:40:43

标签: java c++ swing java-native-interface

我有一个运行很长时间的c ++应用程序,我想跟踪它的进度。我在java中有这个应用程序的用户界面。任何人都可以告诉我如何使用JProgressBar跟踪本机应用程序的进度。我的本机应用程序在完成后返回一个整数,并且我有一个“完成”按钮,在返回此整数时显示。但我希望有一个进度条,显示本机应用程序正在运行。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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());