Windows API一日一練(48)PostThreadMessage函數

來源:互聯網
上載者:User
  Windows API一日一練(48)PostThreadMessage函數

在寫伺服器程式裡,很多地方都需要使用到線程池。特別現在多處理器的CPU越來越普及,使用多個線程池是明顯提高伺服器程式的效能。在以訊息為基礎的Windows系統裡,使用訊息來處理是最簡單的線程池辦法,不但使用起來簡單,而且理解起來也很簡單的方法。建立多個線程後,就可以根據線程的ID來向不同的線程發送訊息,每個線程都處理自己的訊息。而發送訊息給線程的函數是PostThreadMessage函數。下面來示範怎麼樣使用這個函數。

函數PostThreadMessage聲明如下:

WINUSERAPI
BOOL
WINAPI
PostThreadMessageA(
    __in DWORD idThread,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
PostThreadMessageW(
    __in DWORD idThread,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define PostThreadMessage PostThreadMessageW
#else
#define PostThreadMessage PostThreadMessageA
#endif // !UNICODE

idThread是線程ID。
Msg是發送的訊息ID。
wParam是訊息參數。
lParam是訊息參數。

調用函數的例子如下:
#001 //線程運行函數。
#002 //在這裡可以使用類裡的成員,也可以讓衍生類別實現更強大的功能。
#003 //蔡軍生 2007/10/11 QQ:9073204 深圳
#004 DWORD CThreadMsg::Run(void)
#005 {
#006  //建立線程訊息佇列。
#007  MSG msg;
#008  PeekMessage(&msg, NULL, WM_USER, WM_USER+1000, PM_NOREMOVE);
#009
#010  //
#011  for (;;)
#012  {
#013        //尋找是否有線程訊息處理。
#014        BOOL bRes = PeekMessage(&msg, NULL, WM_USER, WM_USER+1000, PM_REMOVE);
#015        if (bRes)
#016        {
#017              //在這裡處理本線程的訊息。
#018              ::OutputDebugString(_T("CThreadMsg::Run() 有訊息處理/r/n"));
#019        }
#020        else
#021        {
#022              //等線程退出事件。
#023              DWORD dwRet = WaitForSingleObject(m_hEventExit,0);
#024              if (dwRet == WAIT_TIMEOUT)
#025              {
#026                    //目前沒有做什麼事情,就讓線程釋放一下CPU。
#027                    Sleep(10);
#028              }
#029              else
#030              {
#031                    //退出線程。
#032                    ::OutputDebugString(_T("CThreadMsg::Run() 退出線程/r/n"));
#033                    break;
#034              }
#035        }
#036  }
#037
#038  //
#039  return 0;
#040 }

上面實現線程的訊息處理。

#001 class CThreadMsg :
#002  public CThread
#003 {
#004 public:
#005  CThreadMsg(void);
#006  virtual ~CThreadMsg(void);
#007
#008  //發送一條訊息給線程處理。
#009  //蔡軍生 2007/10/11 QQ:9073204 深圳
#010  void PostMessage(void)
#011  {
#012        //
#013        ::PostThreadMessage(m_dwThreadID,WM_USER+100,0,0);
#014  }
#015 protected:
#016  virtual DWORD Run(void);
#017 };

上面是調用函數PostThreadMessage發送訊息給線程處理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.