win32:获取事件对象的状态

时间:2009-08-14 13:43:22

标签: c++ winapi

我正在使用以下功能创建3个事件:

HANDLE WINAPI CreateEvent(...);

我正在等待所有 bWaitAll设置为TRUE )事件对象或超时:

DWORD WINAPI WaitForMultipleObjects(...); 

返回值为:

WAIT_TIMEOUT

是否有一种简单的方法可以检查每个事件,以找到未设置的地点?

举个例子:

HANDLE evt1 = ....
HANDLE evt2 = ....
HANDLE evt3 = ....

HANDLE evts[3] = ....

DWORD ret = ::WaitForMultipleObjects(3, evts, TRUE, 10000);

10秒后:

  • 'ret'是WAIT_TIMEOUT。
  • evt1已设置
  • evt2未设置
  • evt3已设置

返回值告诉我“超时间隔已经过去,并且不满足bWaitAll参数指定的条件。”,但不是哪一个被发信号,哪一个没有。

谢谢,

4 个答案:

答案 0 :(得分:3)

是的,在WaitForMultipleObjects()返回后,为每个指定零超时的事件调用WaitForSingleObject()。

对于未发信号的事件,它将返回WAIT_TIMEOUT,对于发出信号的事件,它将返回WAIT_OBJECT_0。不要忘记检查WAIT_FAILED。

当然,与WaitFormultipleObjects()返回时的状态相比,每个事件状态可能都已更改。

答案 1 :(得分:2)

行。在评论中更好地向我解释了问题之后的总重写。

所以,如果我现在正在理解这一点,你就是在将bWaitAll设置为true的情况下调用WaitForMultipleObjects,当你从中获取WAIT_TIMEOUT时,想要找出哪些对象阻碍了它的工作。

在那种情况下,我有尖锐的,有点。您可以为每个对象调用WaitForSingleObject,其超时为0。这样做的问题是它对某些对象有副作用。例如,如果你在互斥上执行此操作并且它成功,你不仅知道它不是罪魁祸首,而且你现在拥有互斥锁。如果那不是你想要的,你必须知道立即释放它。

您采取的任何计划都将受到竞争条件的影响。由于您不在“原子”等待呼叫之外,您可以通过该过程发现它们现在已经准备就绪。你可以找回一套准备好/未准备好的,这不是你在等待呼叫中实际拥有的。

伊克。

答案 2 :(得分:0)

这一切都不起作用,因为即使超时为0,WaitForSingleObject()也会触发自动重置事件。

(与MSDN所说的相反)。

答案 3 :(得分:-1)

如果您的呼叫返回WAIT_TIMEOUT,则表示您发出的NONE对象已发出信号。