我有一个等待计时器,重置时间为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检查一次定时器,这对延迟不会造成太大影响。所以我想知道是否有人对我如何使用计时器有任何想法。我意识到我可以在期望的时间重新设置计时器,但我不明白为什么这不能正常工作。
答案 0 :(得分:2)
用户空间计时器是通用计时器,因此不能保证“超级准确”。它确实只能确保计时器在发射之前等待至少指定的间隔。
可能的实现可能是让“主”计时器每毫秒关闭一次,并递增所有“从”计时器计数器。当计时器的计数器达到指定的间隔时间时,它会触发该事件。根据“主”计时器的配置方式,可能需要稍微长于触发器之间的毫秒(在您的情况下,大约几微秒的时间)。这种轻微的延迟加起来,导致24小时计时器漂移3分钟。
在您的情况下,因为您希望在事件之间等待一整天,最好定期查询系统时间,或使用QueryPerformanceCounter
。