我打算每秒使用一个计时器事件(对于时钟应用程序)。
我可能错了,但我认为实际系统时间可能存在(非常轻微)同步问题。例如,当实际系统时间毫秒为500而不是0时,计时器事件可能会触发(意味着如果你愿意,秒将部分“异相”)。
有没有办法让计时器事件与实时同步,或者在AS3中第二次计时时触发某种系统时间事件?
此外,如果我将Timer设置为每1000毫秒触发一次,是保证还是可以根据应用程序负载进行一些偏移?
这些可能是微不足道的问题,但我只是好奇。
感谢。
答案 0 :(得分:1)
您可以使用Date获取当前时间。如果确实想要,您可以尝试通过尝试将其与Date返回对齐来控制定时器抖动。我不确定这甚至会成为一个问题(当然,如果你的应用程序没有长时间运行,即便如此,我也不确定错误是否会构建得太快)。
请注意,操作系统通常仅在几毫秒内准确无误,如果您需要这种准确性,则可能需要执行其他操作。
答案 1 :(得分:0)
我只想到一种简单的方法来至少提高计时器的准确性。通过简单地减少定时器间隔,可以减小最大误差范围。
因此,将Timer设置为每100ms而不是1000ms触发将导致最大错误为99ms而不是999ms。因此,根据所需的准确性/性能,可以调整这些值。
如果定时器频率必须保持1秒,我们可以创建一个临时初始化定时器,以非常快的间隔(~1ms)触发。然后在每个刻度线上我们跟踪当前时间和前一个时间。如果时间的秒数发生了变化(实际时钟发生了变化),那么我们就可以在那一刻触发主定时器(1000ms)。这将确保1秒计时器在实时秒数改变时启动(错误以单位数毫秒而不是3位毫秒)
当然,再次,从检测到时间变化和计时器开始时会有一些延迟。但至少可以在保持1s定时器的同时提高准确度。
我会在本周的某个时间尝试这个并报告回来。
答案 2 :(得分:0)
不幸的是,我不认为Timer保证保持相同的速度。它很可能会在一段时间内漂移(例如,如果你将它设置为1000毫秒,它可能每990毫秒发射一次,这是一个非常小的差异,但随着时间的推移,它会加起来)。我认为你应该像你说的那样,每100毫秒左右开一次,然后检查Date对象以确定是否已经过了一秒。