给定:我用自动重置事件填充一个句柄数组,并将其传递给具有bWaitAll = FALSE的WaitForMultipleObjects.
从MSDN:"当bWaitAll为FALSE时,此函数按顺序检查数组中的句柄,从索引0开始,直到其中一个对象发出信号.如果多个对象变为信号,则该函数返回其对象被发信号通知的数组中第一个句柄的索引."
所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?
现在我有一个循环:
For ( ; ; ) { WaitForMultipleObjects(…) If (not failed) Process object that called. Remove the handle that signaled from the array. Compact the arrary. }
Michael.. 5
是.另一种方法是你可以在每个句柄上做WaitForSingleObject(句柄,0),它会立即返回并指示它们是否有信号.
编辑:这是我的意思的样本伪代码:
ret = WaitForMultipleObjects() if (ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + (count)) { firstSignaled = ret - WAIT_OBJECT_0; // handles[firstSignaled] guaranteed signalled!! for (i = firstSignaled + 1; i < count; i++) { if (WaitForSingleObject(handles[i], 0) == WAIT_OBJECT_0) { // handles[i] Signaled! } } }
超时为0表示WaitForSingleObject不等待.它检查发信号状态并立即返回WAIT_OBJECT_0或WAIT_TIMEOUT.还是我误解了你的陈述? (2认同)
小智.. 5
所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?
为什么不回到Wait()?如果多个物体发出信号,当你回来时它们仍然会发出信号.当然,如果你在wait对象数组中有一个非常快速地触发第一个对象,它会使其他对象饿死; 你所做的是按照射击频率在等待对象数组中命令你的对象,最少的是先发生.
顺便说一下,你在使用无穷的for(),你可以使用goto.如果你真的没有离开循环,无条件goto最恰当地表达你的意图.
是.另一种方法是你可以在每个句柄上做WaitForSingleObject(句柄,0),它会立即返回并指示它们是否有信号.
编辑:这是我的意思的样本伪代码:
ret = WaitForMultipleObjects() if (ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + (count)) { firstSignaled = ret - WAIT_OBJECT_0; // handles[firstSignaled] guaranteed signalled!! for (i = firstSignaled + 1; i < count; i++) { if (WaitForSingleObject(handles[i], 0) == WAIT_OBJECT_0) { // handles[i] Signaled! } } }
所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?
为什么不回到Wait()?如果多个物体发出信号,当你回来时它们仍然会发出信号.当然,如果你在wait对象数组中有一个非常快速地触发第一个对象,它会使其他对象饿死; 你所做的是按照射击频率在等待对象数组中命令你的对象,最少的是先发生.
顺便说一下,你在使用无穷的for(),你可以使用goto.如果你真的没有离开循环,无条件goto最恰当地表达你的意图.