首頁  >  文章  >  線程間通訊的幾種方法

線程間通訊的幾種方法

hzc
hzc原創
2020-07-01 14:00:1217103瀏覽

線程間通訊的方法有: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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn