关于WaitForMultipleObjects函数监测事件状态的问题

多个内核对象被触发时,WaitForMultipleObjects选择其中序号最小的返回。而WaitForMultipleObjects它只会改变使它返回的那个内核对象的状态。
这儿又会产生一个问题,如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将的不到被出理的机会。

 为了解决这一问题,可以采用双WaitForMultipleObjects检测机制来实现。

这是在百度百科上的一段话。

其实自己在项目中也用到过这个WaitForMultipleObjects函数,但是没有考虑过上述的问题。因为第一:上述的出现(如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将的不到被出理的机会)这种情况的几率较小。第二:即使是偶然出现几次,对项目的数据处理也没什么影响。

但是如果是实时的数据处理,必须在事件被激活后马上进行处理,这种情况下就必须要考虑上述的情况了。


大致的处理代码如下:

DWORD ProcessData()
{
DWORD dwRet = 0;
int nIndex = 0; 
while(1)
{dwRet = WaitForMultipleObjects(nCount,pHandles,false,INFINITE);
switch(dwRet)
{
case WAIT_TIMEOUT:
break;
case WAIT_FAILED:
return 1; 
default: 

nIndex = dwRet - WAIT_OBJECT_0; 
处理索引为nIndex 的event事件,可能要setEvent让其恢复到有信号状态;

处理完成后检测nIndex 之后的所有event,看看有没有是有信号状态的。

nIndex ++;

while(nIndex < nCount)
{
dwRet = WaitForMultipleObjects(nCount - nIndex,&pHandles[nIndex],false,0);
switch(dwRet)
case WAIT_TIMEOUT: 
nIndex = nCount; //退出检测,因为没有被触发的对象了. 
break;
case WAIT_FAILED:
return 1;
default: 
{ nIndex = dwRet - WAIT_OBJECT_0;
   处理索引为nIndex 的event事件,可能要setEvent让其恢复到有信号状态;

   nIndex ++;

break;
}
}
}
break;
}

return 0;
}


以后写代码时再碰到这种问题还是要用WaitForMultipleObjects双检测的好,虽然即使不用影响可能也不大。但是在做项目时还是得严谨,这样的软件健壮性才好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值