У меня есть приложение на С ++, которое работает в течение длительного времени, и я хочу отслеживать его прогресс. У меня есть пользовательский интерфейс для этого приложения в Java. Может кто-нибудь подскажите, пожалуйста, как отслеживать прогресс родного приложения с помощью JProgressBar. Мое родное приложение возвращает целое число, когда оно сделано, и у меня есть кнопка «Готово», которая появляется, когда это целое число возвращается. Но я хочу иметь индикатор выполнения, который показывает, что нативное приложение работает.
Как уже говорили другие, у вашего java-приложения должен быть способ узнать, насколько далеко находится ваше c ++-приложение.
Если вы хотите быстрое исправление, используйте JProgressBar и установите его для взаимного определения. Это оживит бар, чтобы показать вам, что что-то происходит. Как только ваш процесс вернется, установите планку на 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());
Единственным способом было бы либо создать обратный вызов в Java (то есть код на языке c ++ будет вызывать функцию Java), чтобы сообщить о текущем прогрессе, либо создать функцию, которую код Java вызывает для получения текущего прогресса вашей задачи.
http://www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI
Затем Java-код будет использовать значение для обновления панели jprogress.
Другое возможное более простое решение от Адама состоит в том, чтобы ваша программа на C ++ выводила обновление прогресса в стандартный вывод, возможно, в виде строкового представления процента прогресса. Затем процесс Java-программы будет контролировать свой OutputStream, вызывая getInputStream()
на процессе (да, это не опечатка; это getInputStream()
) в фоновом потоке к потоку Swing и используйте информацию для обновления JProgressBar.