• WaitForMultipleObjects用法详解


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

      

  • 相关阅读:
    Codeforces Round #562 (Div. 2) B. Pairs
    Codeforces Round #562 (Div. 2) A.Circle Metro
    K.河北美食
    H.天神的密码
    国标GB28181协议智能分析告警平台EasyGBS及EasyCVR监控系统内iframe的常见问题说明
    【解决方案】国标GB28181平台EasyGBS级联EasyCVR视频智能分析搭建“蓝天卫士”网络视频监控系统技术方案
    【解决方案】基于国标GB28181协议/HIKSDK/Ehome协议EasyCVR智能融合分析平台在智慧校园人脸识别中的应用
    TSINGSEE青犀视频基于开源Webrtc服务器编译mediasoupClient运行报”SignalEncoderTimeOut, Encoder timed out”
    TSINGSEE青犀视频云边端H265播放器EasyPlayer-RTSP在C#版本增加OSD功能说明
    TSINGSEE青犀视频自主研发的H265播放器被集成后无法播放视频是什么原因?
  • 原文地址:https://www.cnblogs.com/curo0119/p/8509944.html
Copyright © 2020-2023  润新知