国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
工作線程與消息循環(huán)
分類: VC and C++ 1038人閱讀 評論(0) 收藏 舉報

轉(zhuǎn)載自:http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html 

首先聲明, 這里的工作線程與UI線程是相對的,即沒有任何窗口的. 如果需要與主線程或其它輔助線程通訊,有幾種方法如事件,消息,信號等,也可以是以上幾種方法的綜合運用.下面就列出以下3種通訊方法的代碼框架

  (1)只用消息通訊

  1. DWORD ThreadProc(LPVOID lParam)  
  2. {  
  3.     //創(chuàng)建線程消息隊列   
  4.     MSG msg;  
  5.     PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);  
  6.     //通知其它線程消息隊列已創(chuàng)建好   
  7.     SetEvent(hEvent);   
  8.   
  9.     while(true)  
  10.     {  
  11.       GetMessage(&msg, NULL, 0, 0);  
  12.       switch(msg.message)  
  13.        {  
  14.           case WM_QUIT:  
  15.                 return 1;  
  16.   
  17.           //自定義消息1處理   
  18.           case WM_USER + 100:  
  19.                 break;  
  20.   
  21.           //自定義消息2處理   
  22.           case WM_USER + 101:  
  23.                 break;  
  24.        }  
  25.     }  
  26.     return 0;  
  27. }  


(2)只用事件通訊

  1. DWORD ThreadProc(LPVOID lParam)  
  2. {  
  3.       DWORD dwIndex;  
  4.       while (true)  
  5.       {  
  6.           dwIndex = WaitForMultipleObjects(cObjects, pObjects, FALSE, INFINTE);  
  7.           if (WAIT_OBJECT + 0== dwIndex)  
  8.           {  
  9.               return 1;     //假設(shè)為退出事件   
  10.             }  
  11.           else if (WAIT_OBJECT + 1 == dwIndex)  
  12.           {  
  13.             //事件1, 處理程序   
  14.            }          
  15.           else if (WAIT_OBJECT + cObjects - 1 == dwIndwx)  
  16.           {  
  17.             //事件2, 處理程序   
  18.            }  
  19.       }  
  20. }  


(3)用消息和事件通訊

 

  1. DWORD ThreadProc(LPVOID lParam)  
  2. {  
  3.    while (TRUE)  
  4.   {  
  5.         DWORD ret ;   
  6.         MSG msg ;   
  7.     
  8.         while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))   
  9.         {   
  10.         switch(msg.message)  
  11.          {  
  12.            //線程退出消息,直接返回   
  13.             case WM_QUIT:  
  14.                 return 1;  
  15.   
  16.            //自定義消息1處理   
  17.             case WM_USER + 100:  
  18.                 break;  
  19.             //自定義消息2處理   
  20.            case WM_USER + 101:  
  21.                break;  
  22.          }  
  23.        }  
  24.        ret = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE,INFINITE,QS_POSTMESSAGE);   
  25.        if (ret == (WAIT_OBJECT_0 + cObjects))  
  26.        {  
  27.           //有新的消息到來,繼續(xù)到上步PeekMessage處理   
  28.           continue;  
  29.        }   
  30.        else   
  31.        {   
  32.           //事件處理   
  33.          if (ret == WAIT_OBJECT_O)  
  34.          {                 
  35.          }  
  36.          else if (ret == WAIT_OBJECT_O + 1)  
  37.          {  
  38.          }  
  39.          else if(ret == WAIT_OBJECT_O + cObjects - 1)  
  40.          {  
  41.          }  
  42.       }      
  43.     return 0;  
  44. }  


上面用到了GetMessage和PeekMessage 函數(shù), 這兩者都是從消息隊列取出消息, 不同的是GetMessage從消息隊列刪除消息,并且阻塞調(diào)用線程. PeekMessage則是查詢消息隊列,如果有消息就取出,沒有消息也立即返回,   是否從消息隊列刪除消息由最后一個參數(shù)決定:PM_REMOVE表示刪除,PM_NOREMOVE表示不刪除.可以簡單地認為,GetMessage是同步的,PeekMessage是異步的。

 

*******************************************************************************************************

除以上作者所提到的線程通信方法外還有一種利用MFC消息循環(huán)通信的方法,其操作過程如下:

1.從CWnd派生類CSendDataWnd

  1. #define WM_SENDDATA WM_USER+100   
  2. #define WM_POSTDATA WM_USER+101   
  3.   
  4. class CSendDataWnd : public CWnd  
  5. {  
  6. public:  
  7.     CSendDataWnd();  
  8.   
  9. protected:  
  10.     //{{AFX_MSG(CSendDataWnd)   
  11.     LRESULT OnSendData(WPARAM wParam, LPARAM lParam);  
  12.     LRESULT OnPostData(WPARAM wParam, LPARAM lParam);  
  13.     //}}AFX_MSG   
  14.     DECLARE_MESSAGE_MAP()  
  15. };  
  16.   
  17.   
  18. BEGIN_MESSAGE_MAP(CSendDataWnd, CWnd)  
  19.     ON_MESSAGE(WM_SENDDATA, OnSendData)  
  20.     ON_MESSAGE(WM_POSTDATA, OnPostData)  
  21. END_MESSAGE_MAP()  
  22.   
  23. CSendDataWnd::CSendDataWnd() {  
  24.   
  25. }  
  26.   
  27. LRESULT CSendDataWnd::OnSendData(WPARAM wParam, LPARAM lParam)  
  28. {  
  29.     switch(wParam) {  
  30.         //自定義消息處理   
  31.     }  
  32.     return 0;  
  33. }  
  34.   
  35. LRESULT CSendDataWnd::OnPostData( WPARAM wParam, LPARAM lParam )  
  36. {  
  37.     switch(wParam) {  
  38.         //自定義消息處理   
  39.     }  
  40.     return 0;  
  41. }  

2.聲明CSendDataWnd變量

  1. CSendDataWnd m_wndSendData;  

 

3.調(diào)用CreateEx創(chuàng)建窗口

  1. if (!m_wndSendData.CreateEx(0, AfxRegisterWndClass(0),  
  2.     _T("SendData Notification window"),  
  3.     WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL)) {  
  4.     TRACE("Create SendData Notification window error!\n");  
  5.     AfxThrowResourceException();  
  6. }  


4.向CSendDataWnd窗口發(fā)送處理消息

  1. m_wndSendData.SendMessage(WM_SENDDATA, wParam, lParam);  
  2. //或   
  3. m_wndSendData.PostMessage(WM_POSTDATA, wParam, lParam);  


5.使用完畢后,在適當位置調(diào)用DestroyWindow銷毀消息窗口防止內(nèi)存泄露

  1. m_wndSendData.DestroyWindow();  
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
深度解析VC中的消息(中)
深度解析VC中的消息傳遞機制
Windows消息編程原理
Windows事件驅(qū)動機制及消息循環(huán)
Windows消息機制 vc
子類化和超類化區(qū)別(轉(zhuǎn)自--眼見為實(2):介紹Windows的窗口、消息、子類化和超類化...
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服