首页 > 解决方案 > 当发生太多事情时,计时器会拖一点

问题描述

我正在开发一个需要进行一些计算并以特定间隔运行一些功能的计时器。我试图保持尽可能大的间隔,但我需要它是一种细粒度的。

这是包含一些需要发生的事情的定期计时器。如您所见,如果满足某些条件,每一秒(经过 % 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();
  }
});

}

标签: flutterdartasynchronoustimer

解决方案


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

你需要稍微改变你的逻辑。例如,您想知道何时通过 1 秒边界。以前,以 10 的精确增量,您知道最终会达到 1000 轮。现在,您可能会看到 995 后跟 1006,并且需要推断您已经越过了第二个边界来运行您的每秒逻辑。


推荐阅读