【发布时间】:2012-03-01 09:42:30
【问题描述】:
我有这个数据流,大致如下:
DataGenerator -> DataFormatter -> UI
DataGenerator 是快速生成数据的东西; DataFormatter 是为了显示目的而对其进行格式化的东西;而 UI 只是一堆 Swing 元素。
我想让我的 DataGenerator 变成这样:
class DataGenerator
{
final private PropertyChangeSupport pcs;
...
public void addPropertyChangeListener(PropertyChangeListener pcl) {
this.pcs.addPropertyChangeListener(pcl);
}
public void removePropertyChangeListener(PropertyChangeListener pcl) {
this.pcs.removePropertyChangeListener(pcl);
}
}
只要我的数据生成器有新数据,只需致电this.pcs.firePropertyChange(...);然后我可以只做dataGenerator.addPropertyListener(listener),其中listener 负责将更改推送到DataFormatter,然后再推送到UI。
这种方法的问题在于,每秒有数千个 dataGenerator 更改(每秒 10,000 到 60,000 次,具体取决于我的情况),并且为 UI 格式化它的计算成本足够高,以至于它不需要在我的 CPU 上加载;实际上,我在视觉上关心的只是每秒最多 10-20 次变化。
有没有办法使用类似的方法,但在更改事件到达 DataFormatter 之前合并它们?如果我收到关于单个主题的多个更新事件,我只关心显示最新的,可以跳过所有以前的。
【问题讨论】:
-
如何使用最后一次 UI 更新的 System.nanoTime 保持一个长值,如果更新后 N ns 发生属性更改事件,则忽略它们?
-
我想到了这一点(见鬼,
System.currentTimeMillis()会起作用——我只关心相对于人类感知而言事情是否很快),但是有一个问题。假设您在视觉更新后 100 微秒有一个更改事件,因此 DataFormatter / UI 会忽略该更改。现在由于某种原因,DataGenerator 停止产生更新(它不一定是每秒连续 10-60K 事件)。糟糕,您错过了最近的更改。这很糟糕。
标签: java swing event-queue