如何正确调用SetWaitableTimerEx

How to call SetWaitableTimerEx correctly

我们在 Boost.Thread 中有一个长期存在的错误报告,其中显然线程睡眠会在计时器结束时将计算机从睡眠中唤醒(https://svn.boost.org/trac/boost/ticket/11368). This is apparently due to the new use of 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 在计时器到期时从睡眠中唤醒?

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

SetWaitableTimerEx has two new parameters: WakeContext and TolerableDelay. You use the WakeContext parameter only when you set a timer that can wake the system from a sleep state.

似乎为 WakeContext 参数传递 NULL 没问题,这是 SetWaitableTimerEx 不会唤醒系统的唯一方法。计时器合并应该仍然有效。

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