1. 程式人生 > >多執行緒執行緒間通訊的三種方法

多執行緒執行緒間通訊的三種方法

多執行緒通訊的方法主要有以下三種: 

1.全域性變數

程序中的執行緒間記憶體共享,這是比較常用的通訊方式和互動方式。

注:定義全域性變數時最好使用volatile來定義,以防編譯器對此變數進行優化。

2.Message訊息機制

常用的Message通訊的介面主要有兩個:PostMessage和PostThreadMessage,

PostMessage為執行緒向主視窗傳送訊息。而PostThreadMessage是任意兩個執行緒之間的通訊介面。

2.1.PostMessage()  函式原型:

    B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

引數:     hWnd:其視窗程式接收訊息的視窗的控制代碼。可取有特定含義的兩個值:     HWND.BROADCAST:訊息被寄送到系統的所有頂層視窗,包括無效或不可見的非自身擁有的視窗、被覆蓋的視窗 和彈出式視窗。訊息不被寄送到子視窗。     NULL:此函式的操作和呼叫引數dwThread設定為當前執行緒的識別符號PostThreadMessage函式一樣。     Msg:指定被寄送的訊息。     wParam:指定附加的訊息特定的資訊。     IParam:指定附加的訊息特定的資訊。     返回值:如果函式呼叫成功,返回非零值:如果函式呼叫失敗,返回值是零。

MS還提供了SendMessage方法進行訊息間通訊,SendMessage(),他和PostMessage的區別是:

SendMessage是同步的,而PostMessage是非同步的。SendMessage必須等傳送的訊息執行之後,才返回。

2.2.PostThreadMessage()

PostThreadMessage方法可以將訊息傳送到指定執行緒。

函式原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam, LPARAM lParam);

引數除了ThreadId之外,基本和PostMessage相同。

目標執行緒通過GetMessage()方法來接受訊息。

注:使用這個方法時,目標執行緒必須已經有自己的訊息佇列。否則會返回ERROR_INVALID_THREAD_ID錯誤。可以用 PeekMessage()給執行緒建立訊息佇列。

3.CEvent物件

CEvent為MFC中的一個物件,可以通過對CEvent的觸發狀態進行改變,從而實現執行緒間的通訊和同步。