2008-10-30 23 views
2

从MSDN:复位定时器可等待

CancelWaitableTimer功能不改变定时器的信号状态。它可以在计时器被设置为信号状态并取消优秀的APC之前停止计时器。因此,对定时器执行等待操作的线程将一直处于等待状态,直到它们超时或定时器重新激活并且其状态设置为发送信号。 如果定时器已处于信号状态,则它保持该状态。

(重点煤矿)

所以:我如何设置了手动复位waitable计时器到无信号状态,如果我不能叫CancelWaitableTimer? ResetEvent不适用于等待定时器(它会因ERROR_INVALID_HANDLE而失败)。

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

回答

2

你能用一些非常大的时间来调用SetWaitableTimer吗?然后一旦知道实时,再打电话给它。

更新:不管有没有文档,文档都很清楚,一个m-r等待定时器“保持在发信状态直到SetWaitableTimer被调用”。在我看来,这是你将不得不使用的功能。你只需要有一个很好的常量叫做'RESET_TIMER',它被设置为-2^63或者其他值。

+0

我可以,但是这是一个黑客攻击的一位。 – 2008-10-30 18:22:43

0

如果您让等待定时器自动复位,那么只要等待该定时器完成,它就会自动复位。

然而,从MSDN:

如果多个对象变得发信号通知,该函数返回其对象被信号通知所述阵列中的第一手柄的索引。

我原本以为,这意味着你可以失去一个定时器信号,如果等待阵列中的一个较早的手柄,同时作为可等待计时器变成信号,但因为我已经读了

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

Behavior of WaitForMultipleObjects when multiple handles signal at the same time