多執行緒執行緒間通訊的三種方法
阿新 • • 發佈:2019-02-13
多執行緒通訊的方法主要有以下三種:
SendMessage是同步的,而PostMessage是非同步的。SendMessage必須等傳送的訊息執行之後,才返回。
CEvent為MFC中的一個物件,可以通過對CEvent的觸發狀態進行改變,從而實現執行緒間的通訊和同步。
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的區別是:
2.2.PostThreadMessage()
PostThreadMessage方法可以將訊息傳送到指定執行緒。函式原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam, LPARAM lParam);
引數除了ThreadId之外,基本和PostMessage相同。目標執行緒通過GetMessage()方法來接受訊息。
注:使用這個方法時,目標執行緒必須已經有自己的訊息佇列。否則會返回ERROR_INVALID_THREAD_ID錯誤。可以用 PeekMessage()給執行緒建立訊息佇列。3.CEvent物件