WaitForMultipleObjects用法详解,一看就懵,物联网嵌入式开发零基础入门

46 阅读3分钟

参数解析:

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毫秒    
int nIndex = WaitForMultipleObjects(2, pThis->m_hEvent, TRUE,500);     
 if (WAIT_OBJECT_0 + 1<= nIndex <= WAIT_OBJECT_0) //所有事件发生   


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/127f093d7c9040b5b3d54f74d3a7ff3e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1773066042&x-signature=QdpwQvLMfwvM6zPFCyBjQs5QoqQ%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9f56c54ca3dd4c3983a26acc49308dd4~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1773066042&x-signature=dbL1ZLuKtveg66LUOoRz1IOQDRU%3D)

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**