如何正确调用SetWaitableTimerEx

时间:2015-09-23 21:29:46

标签: winapi timer power-management

我们在Boost.Thread中有一个长期的错误报告,显然线程睡眠会在计时器过去后将计算机从睡眠中唤醒(https://svn.boost.org/trac/boost/ticket/11368)。这显然是由于SetWaitableTimerEx()的新用法实现了合并计时器支持,我们用这样的REASON_CONTEXT调用:

REASON_CONTEXT default_reason_context={0/*POWER_REQUEST_CONTEXT_VERSION*/, 0x00000001/*POWER_REQUEST_CONTEXT_SIMPLE_STRING*/, (LPWSTR)L"generic"};

如果计时器触发导致PC从睡眠状态唤醒,那么肯定必须与此REASON_CONTEXT值有关。

这里的任何人都可以告诉我们在计时器到期时没有让PC从睡眠状态唤醒的适当值是什么?

1 个答案:

答案 0 :(得分:2)

根据Microsoft的此文档:Windows Timer Coalescing,第8-9页:

  

SetWaitableTimerEx 有两个新参数: WakeContext TolerableDelay 。仅当您设置可以将系统从睡眠状态唤醒的计时器时,才使用 WakeContext 参数。

看起来为NULL参数传递WakeContext似乎很好,这是SetWaitableTimerEx不会唤醒系统的唯一方式。定时器合并应该仍然有效。

我在Windows 10中尝试过,它似乎工作正常。它不会唤醒系统,也不会只是调用SetWaitableTimer。在旧版本的Windows中可能会有所不同,但我还没有测试过。