Я пытаюсь использовать пользовательский выходной поток для отображения вывода из исполняемого файла в области Jtext.JAVA - Внешняя блокировка exe при вызове из пусковой установки
Исполняемый вызывается с помощью кнопки с помощью
try {
Process p = Runtime.getRuntime().exec("cgminer.exe" + " -o " + Infos.Address + ":" + Infos.Port + " -u " + Infos.User + " -p " + Infos.Password);
p.waitFor();
String line;
BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while((line = error.readLine()) != null){
System.out.println(line);
}
error.close();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=input.readLine()) != null){
System.out.println(line);
}
input.close();
OutputStream outputStream = p.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
}
catch (Exception e) {
// ...
}
}
}
, а затем выход направлен на JText с
public class CustomOutputStream extends OutputStream {
private JTextArea textArea;
public CustomOutputStream(JTextArea textArea) {
this.textArea = textArea;
}
@Override
public void write(int b) throws IOException {
textArea.append(String.valueOf((char) b));
textArea.setCaretPosition(textArea.getDocument().getLength());
}
}
Моя проблема заключается, когда я звоню в первый класс на кнопку блокировки и нет вывод делает его в jtext. Только когда я принудительно закрываю cgminer, появится выход.
Любая помощь действительно оценена, так как у меня мозг извращен.
Не работает внешний процесс по определению во внешнем, ну, процессе? Не нужно создавать его в отдельном потоке, 'exec()' должен немедленно возвращаться. (Чтение всего его результата, однако, должно исчезнуть с EDT. Я также не имею в виду, что поток 'write()' работает при выводе подпроцесса в пользовательский 'OutputStream'.) – millimoose
@millimoose: извините, Конечно, конечно. Сам процесс не будет блокироваться, но 'waitFor()' и 'while (...)' loops будут. Исправление ... ... и спасибо! –
+1 для обновления; также рассмотрим «ProcessBuilder»; для удобства, [* начальная нить *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) доступна для дренирования потоков ввода-вывода, если графический интерфейс обновлен на ПО ВОСТОЧНОМУ ВРЕМЕНИ. – trashgod