Chr*_*ris 5 events winapi multithreading
给定:我用自动重置事件填充一个句柄数组,并将其传递给具有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.
}
Run Code Online (Sandbox Code Playgroud)
是.另一种方法是你可以在每个句柄上做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!
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?
为什么不回到Wait()?如果多个物体发出信号,当你回来时它们仍然会发出信号.当然,如果你在wait对象数组中有一个非常快速地触发第一个对象,它会使其他对象饿死; 你所做的是按照射击频率在等待对象数组中命令你的对象,最少的是先发生.
顺便说一下,你在使用无穷的for(),你可以使用goto.如果你真的没有离开循环,无条件goto最恰当地表达你的意图.