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

时间:2015-08-09 15:46:56

标签: java javafx

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

需要考虑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操作。

...

因此,我们将非常感谢如何正确排列作品。

1 个答案:

答案 0 :(得分:1)

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

更新信用@jewelsea获取方法的重要部分https://gist.github.com/jewelsea/5072743“在屏幕上渲染300个图表并将其保存到JavaFX中的文件中。”

  • Platform.runLater
  • 中启动一段代码
  • 在该代码块中启动Task
  • 在任务中:
    • 离线后端非gui工作
    • 完成非gui工作后:
    • 启动Platform.runLater,其中包括:
    • 后端操作完成后要运行的的GUI代码。

这种方法很有效:我可以看到窗口启动,然后在GUI仍然响应时发生后端操作:然后最终 - 一旦后端操作完成 - 然后执行额外的GUI操作。