мой самый первый пост здесь после долгого поиска, но пока нет ответа по этому вопросу, пожалуйста, помогите мне в этом вопросе.
Я использую Netbean 6.9.1 для создания приложения Java, массовый вызовдля нескольких разных внешних программ, поэтому я использовал процесс и функцию времени выполнения для вызова внешней программы.
Весь процесс приложения разделен на несколько этапов, и я хочу сообщить пользователю, до какого этапа приложение в данный момент выполняетсяпри обновлении текстовой области графического интерфейса код отображается следующим образом:
public void executeCommand (String cmd, путь к файлу) {
try
{
****areaOutput.setText("Executing audio decoding, please wait till process is done\n");****
btnTranscribe.setEnabled(false);
areaOutput.setEditable(false);
areaOutput.setEnabled(false);
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
areaOutput.append("\n\nConversion is done, processing with features extraction....");
} catch (Throwable t)
{
t.printStackTrace();
}
}
Как показано в приведенном выше коде, я хочу установитьТекст и отключите некоторые кнопки перед выполнением команды, но когда приложение запускается, кажется, что все эти строки не могут работать, и ничего не изменяется в самом приложении до тех пор, пока команда не будет завершена, любое решение для запуска кода предварительной команды выполняется первымдо запуска .exec ()?
Я ценюсъел вашу большую помощь и совет по этому вопросу.
С наилучшими пожеланиями, Striky
P / S:
Привет, я создал класс Thread для этого CmdExec, чтобывыполнить cmd в другом потоке:
public class CmdExec extends Thread
{
private String cmd;
private File path;
public CmdExec() {
}
public CmdExec(String cmd, File path) {
this.cmd = cmd;
this.path = path;
}
public void run(){
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
}}
и для вызова этого класса
CmdExec tryDemo = new CmdExec ();tryDemo = новый CmdExec (strSegment, fSegment);tryDemo.run ();используется для запуска потока, но я не смог поместить SwingUtilities.invokeLater в какую-либо часть этого процесса, он просто не будет запускать tryDemo.run (), потому что это void ...
Кроме того, можетЯ знаю пока что делаю правильно ??Большое спасибо за вашу любезную помощь по этой проблеме
P / S 2: Я только что добавил еще один исполняемый код (таким образом, потоки для выполнения процесса, запускаемый для обновления GUI) для команды обновления GUI, как показано ниже:
Runnable doWorkRunnable = new Runnable() {
public void run() {
System.out.println("hello world");
btnTranscribe.setEnabled(false);
areaOutput.setEditable(false);
areaOutput.setEnabled(false);
areaOutput.setText("Performing segmentation, please wait till process is done\n"); }
};
и я использовал SwingUtilies.invokeLater перед выполнением процесса, как показано ниже:
SwingUtilities.invokeLater(doWorkRunnable);
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd , null, path);
Но все это не удалось, я получил неправильную последовательность для GUI и координации потоков процесса?