gpt4 book ai didi

java - 如何在 JavaFX 中异步执行需要一些 GUI 操作的较长运行任务?

转载 作者:行者123 更新时间:2023-12-01 11:15:17 24 4
gpt4 key购买 nike

我们有一组场景,其目的是在“安全”之后的某个时刻将它们保存到图像文件中。这里的“安全”意味着“在完成一些后端工作之后以及在场景完全绘制/渲染之后。”

需要考虑 FxApplication 线程的单线程性质:所有与 gui 相关的工作都需要在 FxApplication 线程上进行。因此,我不清楚如何执行需要访问图形上下文的任意 gui 相关操作。

  • javafx.application.Platform.runLater(runnable) 适用于短期操作。事实上,这就是我们启动单独场景的方式:每次调用 runLater 都有一个场景。效果很好。

  • Task 专门用于长时间运行的操作。但是任务应如何与 FxApplication 线程进行互操作?任务似乎没有任何“排队机制”来将工作放回进入 FxApplication 事件循环。

    我们不应该尝试从任务中执行与 GUI 相关的操作 - 这会违反 FxApplication 线程的职责 - 并导致竞争条件。

请注意以下问题Platform.runLater and Task in JavaFX没有解决这种情况,因为显示的 GUI 操作:

           bar.setProgress(counter/1000000.0);

是一个“内置”。我们需要进行任意 gui 操作。

..

因此,我们将不胜感激如何正确排序工作的概述。

最佳答案

以下方法是在“后台”运行 GUI 操作的 AFA(只有一个 GUI 线程 - 因此 GUI 操作的“后台”任务是一个相对术语..)

更新该方法的大部分内容归功于@jewelsea https://gist.github.com/jewelsea/5072743 “在屏幕外渲染 300 个图表并将它们保存到 JavaFX 中的文件中。”

  • Platform.runLater 中启动代码块
  • 在该代码块中启动一个任务
  • 在任务中:
    • 执行线程外后端非 GUI 工作
    • 完成非 GUI 工作后:
    • 启动 Platform.runLater,其中包括:
    • 后端操作完成后您想要运行的 GUI 代码。

这种方法正在发挥作用:我可以看到窗口启动,然后在 GUI 仍然响应时发生后端操作:然后最终 - 一旦后端操作完成 - 然后执行其他 GUI 操作。

关于java - 如何在 JavaFX 中异步执行需要一些 GUI 操作的较长运行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31906019/

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