我正在使用以下功能创建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秒后:
返回值告诉我“超时间隔已经过去,并且不满足bWaitAll参数指定的条件。”,但不是哪一个被发信号,哪一个没有。
谢谢,
答案 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对象已发出信号。