これが私の問題の簡単な例です。JavaFX を使用して GUI を表示する Java アプリがあるとします。ユーザーがスタート ボタンを押すと、アプリは外部サーバーに 15 秒間 ping を送信します。この 15 秒間に、ping プロセスの出力がアプリの GUI に表示されるはずです。これは私がこれまでに持っているものです:
1) JavaFX レイアウトの作成に使用する mypackage/App.fxml ファイル。2) mypackage/AppController.java ファイル 3) mypackage/App.java ファイル
fxml ファイルでは、スタート ボタンが押されたときのコントローラーを AppController.java ファイルに指定します。このコントローラーは次のようになります。
@FXML
private void handleStartAction(ActionEvent event) {
try {
String ping_command = "ping -c 15 google.com";
console.println("\nCOMMAND> "+ping_command);
Process p=Runtime.getRuntime().exec(ping_command);
p.waitFor();
BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()) );
String line=null;
while((line=reader.readLine())!=null)
{
console.println(line);
}
}
catch(Exception e) {
console.println(e);
}
}
私が抱えている問題は、プロセスからの出力を毎秒 1 回読み取るのではなく、外部プロセスが完了するのを待っている間、アプリが完全に 15 秒間ハングすることです。