【问题标题】:pause for the Event Dispatcher为事件调度程序暂停
【发布时间】:2010-12-09 12:24:25
【问题描述】:

我有一个(主要是)单线程应用程序,它会随时更新摆动图表组件 (jfreechart)。

由于对图表的所有更新都是在事件调度线程上完成的,因此任务队列变得太大,并且图表没有随着正在更新它的代码及时更新。

有没有办法每隔一段时间暂停一次,以便事件调度线程可以赶上?

我的第一个想法是通过SwingUtilities.invokeAndWait 来查询一个虚拟任务...可以这么简单吗?

干杯,p.

【问题讨论】:

  • 是的,这似乎有效,有人有更整洁的方法吗?

标签: java swing


【解决方案1】:

虚拟任务可以工作,但也许您可以考虑跳过数据生成线程中的一些更新。

这完全取决于你在做什么。您的目标是尽可能快地计算某些东西并在此过程中更新 GUI,还是尝试创建一个很好的 GUI 来演示一些数据分析?

如果是前者,那么您真的不想阻止等待 GUI 更新 - 它只会减慢您的计算速度。在这种情况下,只需跳过一些更新并将它们合并为不那么频繁、更大的更新。

如果是后者,那么invokeAndWait 可能会成功。

【讨论】:

  • 我正在重用一些专为不太密集的过程而设计的代码,目标只是在以比实时速度更快的速度读回实时信息时可视化实时信息。它不需要非常快,但我希望这个过程和 ED 能够彼此跟上。所以看起来像invokeAndWait。我会看看是否有人想出了更好的东西,或者我会在一两天内给你打勾。干杯。
  • 您始终可以在 invokeAndwait 中进行所有更新 - 然后您可以保证您的读取线程和 EDT 将同步运行。但是,重绘可能仍会合并。
  • 你是对的,但这意味着我需要更改共享代码(我不想这样做)并且它的运行速度比单个 invokeAndWait 慢得多(很多更少)过程中的关键点。
【解决方案2】:

一种方法是解耦更新速率:异步更新数据模型并以较低的可调整速率更新视图。这个example 使用javax.swing.Timer 来实现定期更新,但固定比率是一种替代方法。对于JFreeChartDynamicTimeSeriesCollectionfireSeriesChanged() 方法应该给你必要的控制。

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多