VC++ WaitForMultipleObjects注意事项

通常我们用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在系统消息中表示无效句柄。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值