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