1

私はマルチスレッド、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ミリ秒ごとに発生するため、より良いアプローチがあるかどうかを知りたいと思いました

どんな助けでも大歓迎です。助けてください。ありがとう !

4

1 に答える 1

2

Platform.runLaterを頻繁に実行することでJavaFXイベントキューを圧倒する可能性があるため、応答をバッチ処理して(たとえば、10個のグループで)、バッチごとに1回のrunlater呼び出しを行うことができます。

stackoverflowには特定のコードレビューサイトがあります。

チャートでアニメーションがオフになっていることを確認してください。そうすることで、更新のたびにアニメーションが多すぎないようにします。

あなたの解決策は少し複雑に見えますが、おそらくそれはあなたの状況に正当化されるでしょう、私は知りません。

並行性をどのように処理しているかはわかりませんが、java.util.concurrent並行性チュートリアルをまだ読んでいない場合はご覧ください。まだ行っていない場合は、JavaFXで同時実行性もチェックアウトしてください。場合によっては、高レベルのjava.util.concurrentフレームワークは、低レベルのオブジェクトモニターの待機/通知メソッドよりも表現力が高く、エラーが発生しにくく、操作が簡単で、推論が容易です。

使用しているスレッドの一部をデーモンスレッドとしてマークすることをお勧めします。また、JavaFXタスクのドキュメントの例のように、スレッドの中断やプロセスのキャンセルを処理するロジックを追加することもできます。

Java、マルチスレッド、およびJavaFXを初めて使用する場合は、マルチスレッドのネットワーク化されたJavaFXアプリから始めてください。

多くの場合、並行作業は、タスク/サービスフレームワークを使用してJavaFXアプリケーションスレッドからワーカースレッドにオフロードされます。

于 2012-12-21T10:57:25.103 に答える