【问题标题】:Waitable timer reset period等待定时器复位周期
【发布时间】:2014-08-12 03:06:26
【问题描述】:

我有一个可等待的计时器,其重置时间为 24 小时。但是,计时器每天都会延迟大约 3 分钟。所以我想知道是什么原因造成的。我正在使用SetWaitableTimerlPeriod,它指定了以毫秒为单位的时间。这是我用来设置计时器的代码。

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 我理解为 24 小时。

我每 250 毫秒检查一次计时器,这不会对延迟产生如此大的影响。所以我想知道是否有人对我如何使用计时器有任何想法。我意识到我可以将计时器重新设置为所需的时间,但我不明白为什么这不能正常工作。

【问题讨论】:

  • MSDN 和这个问题有什么关系?
  • 如果您希望计时器每天在同一时间响起,请考虑将其设置为特定时间(每天),而不是使用句点。

标签: c winapi


【解决方案1】:

用户空间计时器是通用计时器,因此不能保证“超级准确”。仅真正保证计时器将在触发前等待至少任何指定的时间间隔。

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

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

【讨论】:

  • Depending on how the "master" timer is configured, it may take slightly longer than a millisecond between triggers (in your case, in the order of a few microseconds longer). This slight delay adds up, resulting in the 3-minute drift from your 24-hour timer. 不过我没有使用主定时器,它是一个具有 24 小时重置周期的单个定时器,它会漂移 3 分钟左右。
  • @user3785768 by "master" timer 我的意思是内核实现的直接响应毫秒间隔的东西。这不是你可以控制的。
  • 哦,我明白了。这可以解释延迟。我会看看你建议的方法。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2019-05-14
  • 2018-12-09
相关资源
最近更新 更多