通常我们用WaitForMultipleObjects来等待多个事件的消息触发响应,如果有多个事件同时到达,那么返回是最小序号事件的句柄,问题是如果最小序号事件频繁触发,那么怎么样才能等到其它序号事件的触发消息呢?这个时候,我们需要继续调用WaitForMultipleObjects来等待事件的触发,不过这次我们要从上次触发事件序号+1开始等待,这样本地调用就不会再触发最小序号事件的内核对象了。
代码如下:
while (!bExit)
{
dwRet = ::WaitForMultipleObjects(nCount, hHandles, FALSE, INFINITE);
switch (dwRet)
{
case WAIT_TIMEOUT:
break;
case WAIT_FAILED:
break;
default:
{
nIndex = dwRet - WAIT_OBJECT_0;
// 对信号量事件进行处理...
nIndex++;
while (nIndex<nCount)
{
dwRet = WaitForMultipleObjects(nCount - nIndex, &hHandles[nIndex], FALSE, 0);
switch (dwRet)
{
case WAIT_TIMEOUT:
nIndex = nCount; //退出检测,因为没有被触发的对象了.
break;
case WAIT_FAILED:
break;
default:
{
nIndex = nIndex + dwRet - WAIT_OBJECT_0;
// 对信号量事件进行处理...
nIndex++;
}
break;
}
}
}
break;
}
}
对信号量事件进行处理时候,如果你需要关闭某个信号量,请重新给nCount和hHandles赋值,否则会一直返回WAIT_FAILED,其错误码是6,错误码6在系统消息中表示无效句柄。