私はマルチスレッド、Java、JavaFxを初めて使用します。ライブデータに基づいてグラフを継続的に更新するJavaFXUIを使用してアプリケーションを構築しています。これが現在のデザインです、
1. JavaFxボタンが押されると、リクエストを送信してレスポンスを取得するためのフレームワークを設定するスレッドを呼び出します
startButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
stopButton.setDisable(false);
if(!startButton.isDisable()){
runSequence = new Thread(new Runnable(){
@Override
public void run() {
SynchThreads sharedObject = new SynchThreads();
new Bridge(sharedObject);
startSequence = new Sequence(sharedObject);
startSequence.performCalls();
}
});
runSequence.start();
}
startButton.setDisable(true);
}
});
2.上記のように呼び出されるrunSequenceスレッドは、常にデータを受信する別のスレッド「callbackThread」を呼び出します。受信したこのデータは、さらに処理するためにrunSequenceスレッドに渡されます。
BusinessLogic businessLogic = new BusinessLogic();
executor.submit(pduApiDllCallBackThread);//This collects the data in background
//Here we are back on runSequence thread that works on the collected data.
while(true){
response = sharedObject.take();
businessLogic.primeData(response);
}
3.このデータを処理した後のBusinessLogicクラスは、グラフに表示する必要のあるイベントIDとデータをユーザーインターフェイスに通知します。
UI.notifyListeners(0, graphCoords);//here event ID is 0 and graphCoords is a HashMap
4.通知を受け取るたびに、ユーザーインターフェイスで、Platform.runLaterを使用して折れ線グラフを更新します。この通知は4ミリ秒ごとに発生します。だから、私は多くのPlatform.runLater呼び出しを行うことになります
public void notifyListeners(int eventType, Map<Integer, Float> graphCoords) {
Platform.runLater(new Runnable(){
@Override
public void run() {
//Old series is cleared. Showing dummy data being updated
series.getData().clear();
series.getData().add(new XYChart.Data("1", Math.random()+1));
series.getData().add(new XYChart.Data("3", Math.random()+5));
series.getData().add(new XYChart.Data("4", Math.random()-25));
series.getData().add(new XYChart.Data("2", Math.random()-10));
series.getData().add(new XYChart.Data("-1", xxx));
}
});
}
これを実行しても問題がない場合、またはUIでこれを処理するためのより良い方法がある場合は、専門家のヒントを提供してください。UIに通知するUIの下のレイヤーをこれ以上制御することはできません。通知は4ミリ秒ごとに発生するため、より良いアプローチがあるかどうかを知りたいと思いました
どんな助けでも大歓迎です。助けてください。ありがとう !