WaitForMultipleObjects等待多个事件对象
来源:互联网 发布:怎么删除网络绯闻 编辑:程序博客网 时间:2024/06/05 05:22
函数原型:
DWORD WaitForMultipleObjects(
DWORD nCount, // number of handles in array
CONST HANDLE *lpHandles, // object-handlearray
BOOL fWaitAll, // wait option
DWORD dwMilliseconds // time-out interval
);
该函数功能强大,几乎可以处理Windows下的所有事件,但在处理多个事件对象时,比较容易出错。
MSDN:
The function modifies the state of some typesof synchronization objects. Modification occurs only for the objector objects whose signaled state caused the function to return. Forexample, the count of a semaphore object is decreased by one. WhenfWaitAll is FALSE, and multiple objects are in the signaledstate, the function chooses one of the objects to satisfythe wait; the states of the objects not selected areunaffected.
问题:
当fWaitAll变量赋值FALSE时,若有多个对象在dwMilliseconds内同时响应,则函数只返回其中一个对象(通常是数组lpHandles中序号最小的)并修改其状态,而不改变其它对象的状态。这将导致序号较小的对象频繁响应,而序号较大的对象得不到处理。本人在coding时,遇到过这种问题。
解决方案:
可采取循环使用双WaitForMultipleObjects函数处理多对象等待问题。
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
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;
ProcessHanlde(nIndex++);
//同时检测其他的事件
while(nIndex <nCount)
{
dwRet =WaitForMultipleObjects(nCount -nIndex,&pHandles[nIndex],false,0);
switch(dwRet)
{
caseWAIT_TIMEOUT:
nIndex= nCount; //退出检测,因为没有被触发的对象了.
break;
caseWAIT_FAILED:
return1;
default:
{
nIndex= dwRet - WAIT_OBJECT_0;
ProcessHanlde(nIndex++);
}
break
}
}
}
break;
}
}
return 0;
}
- WaitForMultipleObjects等待多个事件对象
- WaitForMultipleObjects将用于等待多个对象变为有信号状态
- WaitForMultipleObjects等待超过MAXIMUM_WAIT_OBJECTS个的内核对象
- WaitForMultipleobjects 最大等待对象限制
- WaitforMultipleObjects和事件对象
- WaitForSingleObject 和 WaitForMultipleObjects函数 (让线程挂起等待事件)
- ucosIII 事件标志组、同时等待多个内核对象、存储管理
- 16.4.5 等待多个事件
- ucosIII 同时等待多个内核对象
- 【VS开发】WaitForSingleObject 和 WaitForMultipleObjects函数 (让线程挂起等待事件)
- 33个等待事件 一
- 33个等待事件 二
- 并发编程--等待多个并发事件的完成
- java多线程 等待多个并发事件的完成
- 等待多个并发事件完成的模型
- java多线程 等待多个并发事件的完成【转】
- UCOSIII同时等待多个内核对象(待更)
- osIII任务同时等待多个内核对象
- insert优化
- 网络技术学习手记---OSI 7层模型
- ASP.NET中如何搭建三层架构
- JAVA 多线层 面试最爱
- javascript中event对象详解
- WaitForMultipleObjects等待多个事件对象
- oracle碎片
- datagrid 的双击事件(转)
- PowerShell2.0之与COM对象交互(二)Word自动化
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- 如何成为优秀的开发人员?
- Windows 添加计划任务 每隔一定时间执行指定批处理脚本
- Funshioncharts 参数说明
- 在 vector 容器中排序