Winapi 重置可等待计时器

Winapi 重置可等待计时器,winapi,Winapi,从MSDN: 该功能不会改变计时器的信号状态。它会在计时器设置为信号状态之前停止计时器,并取消未完成的APC。因此,在计时器上执行等待操作的线程将保持等待状态,直到超时或计时器重新激活且其状态设置为signaled。如果计时器已处于信号状态,则它将保持该状态 (强调矿山) 所以:如果我不能调用CancelWaitableTimer,如何将手动重置WaitableTimer设置为无信号状态?ResetEvent在可等待计时器上不起作用(它失败,错误\u无效\u句柄) 我不想使用SetWaitabl

从MSDN:

该功能不会改变计时器的信号状态。它会在计时器设置为信号状态之前停止计时器,并取消未完成的APC。因此,在计时器上执行等待操作的线程将保持等待状态,直到超时或计时器重新激活且其状态设置为signaled。如果计时器已处于信号状态,则它将保持该状态

(强调矿山)

所以:如果我不能调用CancelWaitableTimer,如何将手动重置WaitableTimer设置为无信号状态?ResetEvent在可等待计时器上不起作用(它失败,错误\u无效\u句柄)


我不想使用SetWaitableTimer,因为(此时)我不知道将其设置为什么持续时间。我想我可以将延迟设置为一个很大的数字,但这对我来说有点像是一个黑客行为。

你能不能用一个非常长的时间调用SetWaitableTimer,这是永远不会发生的?一旦你知道实时情况,再打电话


更新:不管是否破解,文档都很清楚,m-r可等待计时器“在调用SetWaitableTimer之前一直处于信号状态”。在我看来,这就是你必须使用的功能。您只需要有一个名为“RESET_TIMER”的很好的常量,它被设置为-2^63或其他值。

如果您使可等待计时器自动重置,那么它将在等待计时器完成后自动重置

但是,从MSDN:

如果多个对象发出信号,则该函数将返回其对象发出信号的数组中第一个句柄的索引

我最初认为这意味着,如果wait数组中的较早句柄与waitable计时器同时发出信号,则可能会丢失计时器信号,但后来我读到了这一点

WaitForMultipleObjects()从0开始扫描句柄数组,并在找到信号句柄后立即返回。只有第一个找到的句柄被重置为未调用状态;其他的都没有动过


我可以,但这有点麻烦。在
SetWaitableTimer()
调用
CancelWaitableTimer()
之后。它将计时器设置为非活动状态-因此它保持以前没有设置过的状态(但我没有验证它)。