当发生太多时,计时器会拖动一点



我正在研究一个计时器,它需要做一些计算,并以一定的间隔运行一些函数。我试图保持间隔尽可能大,但我需要它是细粒度的。

这是需要发生的一些事情的周期计时器。因此,正如您所看到的,如果满足某些条件,它每秒钟(经过% 1000 == 0的毫秒数)都会做一些事情。但是每隔10毫秒,我需要检查一些东西。

这似乎有点太多了,在运行计时器2分钟后,它已经落后了1秒。我想我想错了。我是否可以/应该把所有的逻辑都放在一个异步运行的函数中,这样计时器就可以继续运行了。

如果计时器显示偶尔拖几毫秒,如果它稍后赶上,这不是世界末日。但是现在整个计时器只是拖着。

_timer = Timer.periodic(Duration(milliseconds: 10), (timer) {
passedMilliseconds = passedMilliseconds + 10;
// METRONOME BEEP AND BLINK
if (passedMilliseconds % currentTimerSettingsObject.milliSecondDivider == 0) {
_playMetronomeBeep();
_startMetronomeBlink();
}
// ONE SECOND
if (passedMilliseconds % 1000 == 0) {
secondsDuration--;
// COUNTDOWN
if (secondsDuration < currentTimerSettingsObject.countDown + 1) {
_player.play('sounds/beep.mp3');
}
// SET COUNTDOWN START VALUES
if (secondsDuration == currentTimerSettingsObject.countDown) {
isCountdown = true;
}
notifyListeners();
}
// TIME IS UP
if (secondsDuration < 0) {
switchToNextTimer();
notifyListeners();
}
});

}

您不能依赖计时器准确地按时交付事件。您需要使用一种更精确的方法,而不是简单地将计数器每一次增加10。一个例子是在计时器之前启动一个Stopwatch,然后(知道你的滴答只会间隔大约10ms)读取stopwatch.elapsedMilliseconds,并以此为基础做出决定。

你需要稍微改变一下逻辑。例如,你想知道当你通过一个1秒的边界。在此之前,你的增量是10,你知道最终会达到1000左右。现在,您可能会看到995后面跟着1006,并且需要推断您已经越过了第二个边界来运行每秒逻辑。

最新更新