当发生太多事情时,计时器会有点拖沓
Timer drags a bit when too much is happening
我正在开发一个计时器,它需要在一定的时间间隔内进行一些计算和 运行 一些功能。我正在努力使间隔尽可能大,但我需要它是细粒度的。
这是周期性计时器,其中包含一些需要发生的事情。
因此,正如您所见,如果满足某些条件,每秒(经过的毫秒数 % 1000 == 0)它都会做一些事情。而且每 10 毫秒我需要检查一些东西。
好像有点过分了,运行计时2分钟已经拖了1秒了。我想我正在接近这个错误的方式。 Could/should 我以某种方式将所有逻辑放在一个函数中,该函数只是 运行 异步,因此计时器可以继续运行。
如果计时器显示时不时拖几毫秒,如果稍后赶上,这不是世界末日。但是现在整个计时器都在拖。
_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
,然后(知道你的滴答声只会以大约 10 毫秒为间隔)读取 stopwatch.elapsedMilliseconds
并以此为基础做出决定。
您需要稍微改变一下您的逻辑。例如,您想知道何时通过 1 秒边界。以前,精确增量为 10,您知道最终会达到 1000 轮。现在,您可能会看到 995 后跟 1006,并且需要推断您已经越过第二个边界 运行 您的每秒逻辑.
我正在开发一个计时器,它需要在一定的时间间隔内进行一些计算和 运行 一些功能。我正在努力使间隔尽可能大,但我需要它是细粒度的。
这是周期性计时器,其中包含一些需要发生的事情。 因此,正如您所见,如果满足某些条件,每秒(经过的毫秒数 % 1000 == 0)它都会做一些事情。而且每 10 毫秒我需要检查一些东西。
好像有点过分了,运行计时2分钟已经拖了1秒了。我想我正在接近这个错误的方式。 Could/should 我以某种方式将所有逻辑放在一个函数中,该函数只是 运行 异步,因此计时器可以继续运行。
如果计时器显示时不时拖几毫秒,如果稍后赶上,这不是世界末日。但是现在整个计时器都在拖。
_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
,然后(知道你的滴答声只会以大约 10 毫秒为间隔)读取 stopwatch.elapsedMilliseconds
并以此为基础做出决定。
您需要稍微改变一下您的逻辑。例如,您想知道何时通过 1 秒边界。以前,精确增量为 10,您知道最终会达到 1000 轮。现在,您可能会看到 995 后跟 1006,并且需要推断您已经越过第二个边界 运行 您的每秒逻辑.