gpt4 book ai didi

java - Swing Timer 滴答声不稳定,不规则

转载 作者:行者123 更新时间:2023-11-30 04:36:15 25 4
gpt4 key购买 nike

我对 Java 相当陌生,但对一般编程不太熟悉。我在 Windows Vista 上使用 Java 1.7.0_07。我正在尝试弄清楚如何使 Swing Timer 定期计时。

我注意到,即使我设置了计时器延迟,并且 actionPerformed 事件处理程序中除了 repaint() 方法之外什么都没有,计时器的滴答声却没有稳定甚至准确。

我一直在寻找解决方案一段时间了,并且已经看过,John B Matthews 博士相当简洁 Kinetic Model example 。在他的示例中,默认延迟为 40mS,但计时器实际滴答时间为 47mS +/- 1mS(偶尔会有 32mS 到 63mS 的差异)。在他的 actionPerformed 事件处理程序中花费的时间始终为 0mS。这些结果是通过将他的代码作为应用程序运行而得出的。

如果您仔细观察“原子”的移动,就会发现卡顿现象。我不明白是什么导致计时器出现这种行为。我的计算机上运行着最少的 Windows 任务,但问题仍然存在。

这个问题有解决方案吗?还是这只是 Java 的一个特性?

最佳答案

我没有查看源代码或进行彻底调查。但我最好的猜测是,这是“一项功能”。

javax.swing.Timer 保证您在 EDT 上调用 actionPerformed 方法。因此,每当 Timer 达到其时间间隔时,它可能会在 EDT 上安排一个 Runnable,而 EDT 又会调用 actionPerformed 方法。但是,如果 EDT 在该时刻正忙(例如进行重绘),则它无法执行该 Runnable

所以小延迟是不可避免的......

刚刚检查了源代码,看来我最初的猜测是正确的

void post() {
if (notify.compareAndSet(false, true) || !coalesce) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
SwingUtilities.invokeLater(doPostEvent);
return null;
}
}, getAccessControlContext());
}
}

它使用 invokeLater 来安排 Runnable (很可能这样您就不会像 invokeAndWait 那样累积延迟) )。但这意味着在计时器发布事件和实际触发 actionPerformed 方法之间,EDT 必须完成其之前的任务。而且由于没有机制可以说:“嘿 EDT,停止你现在正在做的事情,先执行我的工作”,因此没有机制可以避免延迟。

也许您可以通过编写自己的使用 SecondaryLoop(在 JDK7 中提供)的 Timer 来获得更好的结果。但这是一个疯狂的猜测(我什么也没尝试)

关于java - Swing Timer 滴答声不稳定,不规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437325/

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