重置等待计时器

时间:2008-10-30 18:13:53

标签: winapi

来自MSDN:

  

CancelWaitableTimer函数不会更改计时器的信号状态。它会在计时器设置为信号状态之前停止计时器并取消未完成的APC。因此,对定时器执行等待操作的线程保持等待,直到它们超时或重新激活定时器并且其状态被设置为发信号。 如果计时器已经处于信号状态,它将保持该状态。

(强调我的)

那么:如果我不能调用CancelWaitableTimer,如何将手动重置等待计时器设置为非信号状态? ResetEvent不适用于可等待的计时器(它因ERROR_INVALID_HANDLE而失败)。

我不想使用SetWaitableTimer,因为(此时)我不知道设置它的持续时间。我想我可以将延迟设置为大量,但这对我来说有点像黑客。

2 个答案:

答案 0 :(得分:2)

你可以用一段非常大的时间来调用SetWaitableTimer,这是不会发生的?一旦你知道实时,就再打电话。

更新:哈哈与否,文档非常清楚m-r等待计时器“在调用SetWaitableTimer之前一直处于信号状态”。在我看来,这是你将要使用的功能。你只需要有一个名为'RESET_TIMER'的常量,它被设置为-2 ^ 63或者什么。

答案 1 :(得分:0)

如果您使等待定时器自动重置,则一旦等待该定时器完成,它将自动重置。

但是,来自MSDN:

  

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

我原本以为这意味着如果等待数组中的早期句柄与等待计时器同时发出信号,则可能会丢失计时器信号,但我已经阅读了

  

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

请参阅Behavior of WaitForMultipleObjects when multiple handles signal at the same time