现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

工作线程与消息循环

2014-07-01 05:10 工业·编程 ⁄ 共 2105字 ⁄ 字号 暂无评论

首先声明, 这里的工作线程与UI线程是相对的,即没有任何窗口的. 如果需要与主线程或其它辅助线程通讯,有几种方法如事件,消息,信号等,也可以是以上几种方法的综合运用.下面就列出以下3种通讯方法的代码框架

  (1)只用消息通讯

DWORD ThreadProc(LPVOID lParam) 

    //创建线程消息队列 
    MSG msg; 
    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); 
    //通知其它线程消息队列已创建好 
    SetEvent(hEvent);  
 
    while(true) 
    { 
      GetMessage(&msg, NULL, 0, 0); 
      switch(msg.message) 
       { 
          case WM_QUIT: 
                return 1; 
 
          //自定义消息1处理 
          case WM_USER + 100: 
                break; 
 
          //自定义消息2处理 
          case WM_USER + 101: 
                break; 
       } 
    } 
    return 0; 

(2)只用事件通讯

DWORD ThreadProc(LPVOID lParam) 

      DWORD dwIndex; 
      while (true) 
      { 
          dwIndex = WaitForMultipleObjects(cObjects, pObjects, FALSE, INFINTE); 
          if (WAIT_OBJECT + 0== dwIndex) 
          { 
              return 1;     //假设为退出事件 
            } 
          else if (WAIT_OBJECT + 1 == dwIndex) 
          { 
            //事件1, 处理程序 
           }         
          else if (WAIT_OBJECT + cObjects - 1 == dwIndwx) 
          { 
            //事件2, 处理程序 
           } 
      } 

(3)用消息和事件通讯

 
DWORD ThreadProc(LPVOID lParam) 

   while (TRUE) 
  { 
        DWORD ret ;  
        MSG msg ;  
   
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  
        {  
        switch(msg.message) 
         { 
           //线程退出消息,直接返回 
            case WM_QUIT: 
                return 1; 
 
           //自定义消息1处理 
            case WM_USER + 100: 
                break; 
            //自定义消息2处理 
           case WM_USER + 101: 
               break; 
         } 
       } 
       ret = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE,INFINITE,QS_POSTMESSAGE);  
       if (ret == (WAIT_OBJECT_0 + cObjects)) 
       { 
          //有新的消息到来,继续到上步PeekMessage处理 
          continue; 
       }  
       else  
       {  
          //事件处理 
         if (ret == WAIT_OBJECT_O) 
         {                
         } 
         else if (ret == WAIT_OBJECT_O + 1) 
         { 
         } 
         else if(ret == WAIT_OBJECT_O + cObjects - 1) 
         { 
         } 
      }     
    return 0; 

上面用到了GetMessage和PeekMessage 函数, 这两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消息,并且阻塞调用线程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立即返回,   是否从消息队列删除消息由最后一个参数决定:PM_REMOVE表示删除,PM_NOREMOVE表示不删除.

    可以简单地认为,GetMessage是同步的,PeekMessage是异步的

给我留言

留言无头像?