WaitForMultipleObjects用法详解,一看就懂

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) //所有事件发生    
{     
 //所有的信号量都有效时(事件都发生)其中之一无效。    
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏行者悟空

基于Scala Acotor实现多线程单词统计(WordCount)

1142
来自专栏Python

mysql:索引原理与慢查询优化

一 索引的原理 1. 索引原理 索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子...

3786
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第六天 MySQL回顾学习

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过sql语句对数据库中的数据进行增加,修改,删除及查询操作

892
来自专栏闻道于事

PL/SQL 编程(二)游标、存储过程、函数

游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段。 可以将游标形象的...

2886
来自专栏日常分享

网络通信中基于套接字输入流和输出流的创建

  (2)由套接字对象Socket调用getInputStream()或getOutputStream()方法,分别返回具有套接字通信的基础输入流InputSt...

482
来自专栏函数式编程语言及工具

Scalaz(50)- scalaz-stream: 安全的无穷运算-running infinite stream freely

scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现。这是因为外界...

1756
来自专栏熊二哥

JDK1.8快速入门

JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就...

1849
来自专栏hbbliyong

c# 获取串口设备的输入(unsigned char *和 char*)

因为是C#,所以平台肯定是.NET了。 之前因为一个小小的业务需要接触了下密码键盘的操作。其实就是简单的获取用户输入密码的操作,没碰到什么大的问题,但是查资料的...

34011
来自专栏逸鹏说道

Linq Like的操作

Like的操作,有点像in,但是,方向变了。什么意思呢。就是你给定一个字符串,去寻找数据中某个字段包含这个字符串。就是给定的字符串是某字段的子集。Sql Scr...

2715
来自专栏我是攻城师

MySQL的InsertOrUpdate语法

2764

扫描关注云+社区