gpt4 book ai didi

java - 请求 JavaFX 线程在不使用 Platform.runLater 的情况下调用一些代码

转载 作者:行者123 更新时间:2023-12-02 04:54:38 27 4
gpt4 key购买 nike

在我正在制作的应用程序中,我希望在一个线程上完成所有操作。我想介绍一些异步的网络IO。我想我应该将其保留在一个线程上以减少复杂性,并且只使用 channel /选择器。

有没有办法让主 JavaFX 线程定期(或在其逻辑结束时)调用代码块。在这种情况下,我希望它经常执行此操作,以便始终保持应用程序最新。

我尝试四处寻找如何做到这一点,但没有成功。

如果我要从中制作一些 ASCII 艺术:

|                    Is there a gap here I can run the code in?
| V
|[JavaFX thread]--------------o --------------o --------------o
| ^
| Here all the UI work is done and it pauses before starting again

我不知道 JavaFX 线程是否真的是这样工作的。我认为在完成所有图形更新和逻辑之后,它会休息一下并调用任何 Runnable 来由 Platform.runLater 执行。这里的问题是我不想一直用新的 Runnables 发送垃圾邮件,我猜这是不好的做法?

理想情况下,我希望主 JavaFX 线程执行其所有逻辑,然后轮询来自网络连接的任何输入。即使用户什么都不做,它也应该运行(这意味着我不能依赖用户输入事件来触发套接字读取)。

有办法做到这一点吗?

注意:从套接字接收的数据将与 JavaFX 模块中的内容交互,因此更有理由将其保留在主 JavaFX 线程上。

最佳答案

您可以这样做,但请注意,当处理时间过长时,它可能会阻塞您的 UI。你可以滥用TimelinePauseTransition为此,或者您可以使用 ReactFX 中的方便包装器.

暂停转换

PauseTransition pt = new PauseTransition(Duration.millis(500));
pt.setOnFinished(ae -> {
// do your work here, it runs on the JavaFX application thread
});
SequentialTransition seq = new SequentialTransition(pt);
seq.setCycleCount(Animation.INDEFINITE);
seq.play();

时间线

Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> {
// do your work here, it runs on the JavaFX application thread
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();

ReactFX

FxTimer.runPeriodically(
Duration.ofMillis(500),
() -> {
// do your work here, it runs on the JavaFX application thread
});

关于java - 请求 JavaFX 线程在不使用 Platform.runLater 的情况下调用一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909105/

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