Winapi 如何正确调用SetWaitableTimerEx

Winapi 如何正确调用SetWaitableTimerEx,winapi,timer,power-management,Winapi,Timer,Power Management,我们在Boost中有一个长期存在的bug报告。显然线程处于睡眠状态的线程将在计时器消失()时唤醒计算机。这显然是由于新使用了来实现合并计时器支持,我们用REASON\u上下文调用它,如下所示: REASON_CONTEXT default_reason_context={0/*POWER_REQUEST_CONTEXT_VERSION*/, 0x00000001/*POWER_REQUEST_CONTEXT_SIMPLE_STRING*/, (LPWSTR)L"generic"}; 如果定时器

我们在Boost中有一个长期存在的bug报告。显然线程处于睡眠状态的线程将在计时器消失()时唤醒计算机。这显然是由于新使用了来实现合并计时器支持,我们用
REASON\u上下文
调用它,如下所示:

REASON_CONTEXT default_reason_context={0/*POWER_REQUEST_CONTEXT_VERSION*/, 0x00000001/*POWER_REQUEST_CONTEXT_SIMPLE_STRING*/, (LPWSTR)L"generic"};
如果定时器触发导致电脑从睡眠中醒来,那么它肯定与此
原因\u上下文
值有关


这里的任何人都可以告诉我们,在计时器到期时不让电脑从睡眠中唤醒的适当值是多少?

根据Microsoft提供的此文档,第8-9页:

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

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


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

当文档看起来像这样奇怪时,请始终查看实际的SDK声明。右键单击>转到定义如果您使用VS,您将进入WinBase.h。您将看到WakeContext参数实际上是
\uuu in_opt
,而不是MSDN文章中建议的
\uin
。从反汇编中我们知道,为WakeContext指定NULL会导致调用SetWaitableTimer()(即禁用合并计时器支持)。我想如果预期的睡眠时间超过几秒钟就可以了?看起来我错过了文档中的那一段。非常感谢。