我们在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从睡眠状态唤醒的适当值是什么?
答案 0 :(得分:2)
根据Microsoft的此文档:Windows Timer Coalescing,第8-9页:
SetWaitableTimerEx 有两个新参数: WakeContext 和 TolerableDelay 。仅当您设置可以将系统从睡眠状态唤醒的计时器时,才使用 WakeContext 参数。
看起来为NULL
参数传递WakeContext
似乎很好,这是SetWaitableTimerEx
不会唤醒系统的唯一方式。定时器合并应该仍然有效。
我在Windows 10中尝试过,它似乎工作正常。它不会唤醒系统,也不会只是调用SetWaitableTimer
。在旧版本的Windows中可能会有所不同,但我还没有测试过。