線程間通訊的方法有:1、全域變量,進程中的線程間記憶體共享,這是比較常用的通訊方式和互動方式;2、Message訊息機制;3、CEvent對象,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的差異是:
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的觸發狀態進行改變,從而實現執行緒間的通訊與同步。
以上是線程間通訊的幾種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!