Моя проблема связана с Process и Runtime, и я пытался запустить его, позволяя основному графическому интерфейсу Java Swing обновлять строку состояния, поэтому здесь идет речь:
Последние три месяца я работал над внутренним инструментом разработки для моей группы разработчиков программного обеспечения. Основа заключается в том, что он принимает некоторые переменные, определенные в графическом интерфейсе пользователя, на основе записей пользователя. Затем он компилирует их в командный файл для интерпретации инструментом командной строки. Просто получить графический интерфейс для запуска командной строки после нажатия кнопки «патч» было довольно интересно, но я не смог прочитать какие-либо ошибки, которые могли возникнуть во время выполнения, в немалой степени из-за того, что я использовал «start» в аргументах для runtimeVar.exec (). Мне удалось помочь резиденту Java, но он переключился с разветвления процесса на другой поток на запуск процесса в том же потоке, блокируя GUI от реакции на что-либо еще. Хотя инструмент работает отлично, бета-тестеры жалуются, потому что не знают, работает он или нет.
Короче говоря: мне нужно раскошелиться на runtimeVar.exec () на другой процесс, чтобы разрешить обновление строки состояния, но для этого потребуется серьезная переделка, поскольку именно так сейчас выглядит мой код как:
private void runPatchTool(File directory, String batchName) throws Exception{
/***************************************************************************
* Method: runPatchTool
* Tab: Both
* Status: Completed, as of 1/10/12
*
* This method will read in a directory and batch file name and output
* these commands to the command line, running the batch file while reading
* in the output via the the InputStreamReader and parsing this to check
* for any errors that may have occurred during the patching.
*
**************************************************************************/
String tempOFP = null;
Boolean labType = false;
String tmpCountry = null;
int yesNo;
String s = " ";
String er = " ";
String[] query = new String[]{"cmd.exe","/c",directory.getPath() + "\\" + batchName};
// displayStatus("Running Patch_tool.exe . . . ");
ProcessBuilder pb = new ProcessBuilder(query);
pb.directory(directory);
try{
Process proc = pb.start();
InputStreamReader inStrmRd = new InputStreamReader(proc.getInputStream());
InputStreamReader erStrmRd = new InputStreamReader(proc.getErrorStream());
BufferedReader commandResult = new BufferedReader(inStrmRd);
BufferedReader errResult = new BufferedReader(erStrmRd);
String line = " ";
String erLine = " ";
try {
while ((line = commandResult.readLine()) != null) {
s += line + "\n";
}
while((erLine = errResult.readLine()) != null){
er += erLine + "\n";
}
} catch (Exception e) {
JOptionPane.showMessageDialog(this,"Path Tool Error: " + e, "ERROR", JOptionPane.ERROR_MESSAGE);
}
// readOutputFiles();
} catch(IOException e){
JOptionPane.showMessageDialog(this,"Path Tool Error: " + e, "ERROR", JOptionPane.ERROR_MESSAGE);
}
StringBuffer erMsg = new StringBuffer("at least one assembler error has occurred");
CharSequence erMsgSeq = erMsg;
try{
PrintWriter outputFile = new PrintWriter(new FileOutputStream(directory.getPath() + "\\cmdout.txt"));
outputFile.print(s);
outputFile.close();
PrintWriter erFile = new PrintWriter(new FileOutputStream(directory.getPath() + "\\errout.txt"));
erFile.print(er);
erFile.close();
} catch(Exception ex){
System.out.println("Something happened in PrintWriter: " + ex);
}
}
Есть еще код, который я пропустил, но он не относится к конкретной проблеме.
Хорошо, со всем вышесказанным, есть ли способ запустить этот процесс, не блокируя графический интерфейс пользователя и все же ожидая завершения процесса (с помощью обратного вызова или другого метода) перед выполнением следующего шага?