等待定时器重置期

时间:2014-08-11 17:44:53

标签: c winapi

我有一个等待计时器,重置时间为24小时。然而,计时器将每天延迟大约3分钟。所以我想知道是什么原因引起的。我正在使用SetWaitableTimer int SetTimr(LARGE_INTEGER* fire, node* cursor, LONG reset) { // Create an unnamed waitable timer. cursor->hTimer = CreateWaitableTimer(NULL, false, NULL); if (cursor->hTimer == NULL) { printf("CreateWaitableTimer failed (%d)\n", GetLastError()); return 1; } // Set a timer to wait for N seconds. if (!SetWaitableTimer(cursor->hTimer, fire, reset, NULL, NULL, true)) { printf("SetWaitableTimer failed (%d)\n", GetLastError()); return 1; } return 0; } 来指定时间,以毫秒为单位。这是我用来设置计时器的代码。

fire

reset是应该发出从未发生过问题的信号的时间。

#define DAY 86400000是定时器再次触发的时间,它被设置为a

{{1}}我明白这将是24小时。

我每隔250ms检查一次定时器,这对延迟不会造成太大影响。所以我想知道是否有人对我如何使用计时器有任何想法。我意识到我可以在期望的时间重新设置计时器,但我不明白为什么这不能正常工作。

1 个答案:

答案 0 :(得分:2)

用户空间计时器是通用计时器,因此不能保证“超级准确”。它确实只能确保计时器在发射之前等待至少指定的间隔。

可能的实现可能是让“主”计时器每毫秒关闭一次,并递增所有“从”计时器计数器。当计时器的计数器达到指定的间隔时间时,它会触发该事件。根据“主”计时器的配置方式,可能需要稍微长于触发器之间的毫秒(在您的情况下,大约几微秒的时间)。这种轻微的延迟加起来,导致24小时计时器漂移3分钟。

在您的情况下,因为您希望在事件之间等待一整天,最好定期查询系统时间,或使用QueryPerformanceCounter