flutter - 当发生太多事情时,计时器会拖一点
问题描述
我正在开发一个需要进行一些计算并以特定间隔运行一些功能的计时器。我试图保持尽可能大的间隔,但我需要它是一种细粒度的。
这是包含一些需要发生的事情的定期计时器。如您所见,如果满足某些条件,每一秒(经过 % 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
在计时器之前启动一个,然后(知道你的滴答声只会以大约 10 毫秒的间隔)读取stopwatch.elapsedMilliseconds
并以此为基础做出决定。
你需要稍微改变你的逻辑。例如,您想知道何时通过 1 秒边界。以前,以 10 的精确增量,您知道最终会达到 1000 轮。现在,您可能会看到 995 后跟 1006,并且需要推断您已经越过了第二个边界来运行您的每秒逻辑。
推荐阅读
- cupy - 遍历数组时,Cupy 比 numpy 慢
- microsoft-graph-api - 如何使用图形 API 从 OneDrive 中的 Excel 获取图表
- javascript - I have two data structures that have some duplicated information. Is there a way to reduce this duplication using .map?
- node.js - 在 Windows 中运行在 Mac 上创建的电子项目时如何避免错误?
- vue.js - vue-router 中的 next() 守卫功能如何工作?
- python - Django/Python 缓存解决方案,我可以使用复杂的键而不是字符串来访问
- python - 变量和损失评估的奇怪排序
- amazon-web-services - 允许使用小写字母数字字符和连字符的 Terraform RDS 实例错误
- python - 从熊猫数据框中删除方括号
- php - 删除项目时的Laravel分页问题