gpt4 book ai didi

JavaFx 根据 Java 线程的通知更新 UI

转载 作者:行者123 更新时间:2023-11-30 04:33:46 27 4
gpt4 key购买 nike

我是多线程、Java 和 JavaFx 的新手。我正在使用 JavaFX UI 构建一个应用程序,它根据实时数据不断更新图表。这是当前的设计,

<强>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 更新 LineChart。此通知每 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 毫秒发生一次,我想知道是否有更好的方法

感谢任何帮助。请帮忙。谢谢!

最佳答案

您可能会因频繁执行 Platform.runLater 而淹没 JavaFX 事件队列,因此您可能希望对响应进行批处理(例如以 10 为一组),然后为每个批处理进行一次 runlater 调用。

有一个特定的codereview stackoverflow 上的网站。

确保图表上的动画已关闭,这样它就不会在每次更新时尝试做太多事情。

您的解决方案确实看起来有点复杂,但也许它适合您的情况,我不知道。

我不知道你是如何处理并发的,但是看看java.util.concurrentconcurrency tutorial如果你还没有。还结账Concurrency in JavaFX如果你还没有。有时,较高级别的 java.util.concurrent 框架比较低级别的对象监视器等待/通知方法更具表现力、更不易出错、更易于使用且更易于推理。

您可能想要将您正在使用的一些线程标记为 daemon threads 。您可能还想添加一些逻辑来处理线程中断或进程取消,类似于 JavaFX Task 中的示例。文档。

如果您对 Java、多线程和 JavaFX 不熟悉,那么从多线程、联网 JavaFX 应用程序开始就已经很困难了。

通常,并发工作会使用 Task/Service framework 从 JavaFX 应用程序线程卸载到工作线程。 .

关于JavaFx 根据 Java 线程的通知更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13985059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com