本文转载于:http://blog.csdn.net/sac761/article/details/52456385

WaitForMultipleObjects是Windows中的一个功能非常强大的函数,几乎可以等待Windows中的所有的内核对象

函数原型为:

DWORD WaitForMultipleObjects(

DWORD nCount,             // number of handles in the handle array

CONST HANDLE *lpHandles,  // pointer to the object-handle array

BOOL fWaitAll,            // wait flag

DWORD dwMilliseconds      // time-out interval in milliseconds

);

参数解析:

DWORD 就是 Double Word, 每个word为2个字节的长度,DWORD双字即为4个字节,每个字节是8位。

nCount  指定列表中的句柄数量  最大值为MAXIMUM_WAIT_OBJECTS(64)

*lpHandles 句柄数组的指针。lpHandles为指定对象句柄组合中的第一个元素 HANDLE类型可以为(Event,Mutex,Process,Thread,Semaphore)数组

bWaitAll 等待的类型,如果为TRUE,表示除非对象都发出信号,否则就一直等待下去;如果FALSE,表示任何对象发出信号即可

dwMilliseconds指定要等候的毫秒数。如设为零,表示立即返回。如指定常数INFINITE,则可根据实际情况无限等待下去

函数的返回值有:

WAIT_ABANDONED_0:所有对象都发出消息,而且其中有一个或多个属于互斥体(一旦拥有它们的进程中止,就会发出信号)

WAIT_TIMEOUT:对象保持未发信号的状态,但规定的等待超时时间已经超过

WAIT_OBJECT_0:所有对象都发出信号

WAIT_IO_COMPLETION:(仅适用于WaitForMultipleObjectsEx)由于一个I/O完成操作已作好准备执行,所以造成了函数的返回

返回WAIT_FAILED则表示函数执行失败,会设置GetLastError

如bWaitAll为FALSE,那么返回结果相似,只是可能还会返回相对于WAIT_ABANDONED_0或WAIT_OBJECT_0的一个正偏移量,指出哪个对象是被抛弃还是发出信号。

WAIT_OBJECT_0是微软定义的一个宏,你就把它看成一个数字就可以了。

例如,WAIT_OBJECT_0 + 5的返回结果意味着列表中的第5个对象发出了信号

如果程序中的nObjectWait是WAIT_OBJECT_0 + 5

int nIndex = nObjectWait - WAIT_OBJECT_0;就是说nIndex =5也就表示第5个对象发出了信号

例子:

当 bWaitAll参数为FALSE可以等待其中之一的事件

HANDLE m_hEvent[2];
//两事件 m_hEvent[0]=CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEvent[1]=CreateEvent(NULL, FALSE, FALSE, NULL);
CreateThread(NULL, 0, MyThreadProc, this, 0, NULL);
DWORD WINAPI MyThreadProc(LPVOID lpParam)
{
while(TRUE)
{ //每次等500毫秒
int nIndex = WaitForMultipleObjects(2, pThis->m_hEvent, FALSE,500);
if (nIndex == WAIT_OBJECT_0 + 1)
{
//第二个事件发生 //ExitThread(0); //break;
}
else if (nIndex == WAIT_OBJECT_0) //第一个事件发生
{
//第一个事件
}
else if (nIndex == WAIT_TIMEOUT) //超时500毫秒
{ //超时可作定时用
}
}
OutputDebugString("线程结束. /n");
return 0L;}

  

当要处理第一个事件时,你只需执行SetEvent(m_hEvent[0]);  即可进入第一个事件的位置

当要执行第二个事件时执行SetEvent(m_hEvent[1]);

当 bWaitAll参数为TRUE等待所有的事件

DWORD WINAPI MyThreadProc(LPVOID lpParam)
while(TRUE)
{ //每次等500毫秒
nt nIndex = WaitForMultipleObjects(2, pThis->m_hEvent, TRUE,500);
if (WAIT_OBJECT_0 + 1<= nIndex <= WAIT_OBJECT_0) //所有事件发生
{
//所有的信号量都有效时(事件都发生)其中之一无效。
}

  

最新文章

  1. C++程序员如何转Java
  2. iOS 运行时
  3. Dijkstra(变形) POJ 1797 Heavy Transportation
  4. 一张图读懂Java多线程
  5. https_request请求接口返回数据
  6. Linux禁止ping服务
  7. hdu 5610 Baby Ming and Weight lifting
  8. js--事件对象的理解5-
  9. ActionBarSherlock,SlidingMenu
  10. (原创)用Java实现链表结构对象:单向无环链表
  11. HTML5 Geolocation API工作原理[转载]
  12. 解决myeclipse部署按钮不能点
  13. [BZOJ 4589]Hard Nim
  14. Java进阶(十二)JDK版本错误之Unsupported major.minor version 51.0(jdk版本错误)
  15. 一段奇葩Javascript代码引发的思考
  16. ES6部分知识点总结
  17. python 基础之自动类型转换和强制类型转换
  18. ubuntu 14.04解决wifi连接不稳定问题
  19. 用matplotlib.pyplot画简单的折线图,直方图,散点图
  20. 超详细动手搭建一个Vuepress站点及开启PWA与自动部署

热门文章

  1. 谈话准备.xmind 思维导图模版
  2. 让360双核浏览器默认极速模式,避免采用IE模式无法正常访问html5网页的解决办法
  3. php CI 实战教程第一季百度经验杂志
  4. Python入门之用Python统计代码行
  5. Java第一次实验 20145104张家明
  6. 20145322 Exp5 MS08_067漏洞测试
  7. Mato的文件管理 (莫队)题解
  8. 【第三十二章】 elk(3)- broker架构 + 引入logback
  9. rg.apache.ibatis.binding.BindingException: Mapper method &#39;com.dao.Cameao.getOnlineDayRation attempted to return null from a method with a primitive return type (float)
  10. BZOJ 1003: [ZJOI2006]物流运输(spfa+dp)