七、執行緒間通訊
一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。
使用全域性變數進行通訊
由於屬於同乙個程序的各個執行緒共享作業系統分配該程序的資源,故解決執行緒間通訊最簡單的一種方法是使用全域性變數。對於標準型別的全域性變數,我們建議使用volatile 修飾符,它告訴編譯器無需對該變數作任何的優化,即無需將它放到乙個暫存器中,並且該值可被外部改變。如果執行緒間所需傳遞的資訊較複雜,我們可以定義乙個結構,通過傳遞指向該結構的指標進行傳遞資訊。
使用自定義訊息
我們可以在乙個執行緒的執行函式中向另乙個執行緒傳送自定義的訊息來達到通訊的目的。乙個執行緒向另外乙個執行緒傳送訊息是通過作業系統實現的。利用windows作業系統的訊息驅動機制,當乙個執行緒發出一條訊息時,作業系統首先接收到該訊息,然後把該訊息**給目標執行緒,接收訊息的執行緒必須已經建立了訊息迴圈。
例程7 multithread7
該例程演示了如何使用自定義訊息進行執行緒間通訊。首先,主線程向ccalculatethread執行緒傳送訊息wm_calculate,ccalculatethread執行緒收到訊息後進行計算,再向主線程傳送wm_display訊息,主線程收到該訊息後顯示計算結果。
建立乙個基於對話方塊的工程multithread7,在對話方塊idd_multithread7_dialog中加入三個單選按鈕idc_radio1,idc_radio2,idc_radio3,標題分別為1+2+3+4+......+10,1+2+3+4+......+50,1+2+3+4+......+100。加入按鈕idc_sum,標題為「求和」。加入標籤框idc_status,屬性選中「邊框」;
在multithread7dlg.h中定義如下變數:
1.
protected
:
2.
int
naddend;
代表加數的大小。
分別雙擊三個單選按鈕,新增訊息響應函式:
01.
void
cmultithread7dlg::onradio1()
02.
05.
06.
void
cmultithread7dlg::onradio2()
07.
11.
12.
void
cmultithread7dlg::onradio3()
13.
並在oninitdialog函式中完成相應的初始化工作:
1.
bool
cmultithread7dlg::oninitdialog()
2.
以上**使得主線程類cmultithread7dlg可以處理wm_display訊息,即在idc_status標籤框中顯示計算結果。
雙擊按鈕idc_sum,新增訊息響應函式:
01.
void
cmultithread7dlg::onsum()
02.
onsum()函式的作用是建立calculatethread執行緒,延時給該執行緒傳送wm_calculate訊息。
右擊工程並選中「new class…」為工程新增基類為 cwinthread 派生執行緒類 ccalculatethread。
在檔案calculatethread.h 中新增
1.
#define wm_calculate wm_user+1
2.
class
ccalculatethread :
public
cwinthread
3.
08.
09.
sleep(500);
10.
::postmessage((
hwnd
)(getmainwnd()->getsafehwnd()),wm_display,ntmpt,null);
11.
12.
return
0;
13.
}
14.
begin_message_map(ccalculatethread, cwinthread)
15.
//}afx_msg_map
18.
on_thread_message(wm_calculate,oncalculate)
19.
//和主線程對比,注意它們的區別
20.
end_message_map()
在calculatethread.cpp檔案的開頭新增一條:
1.
#include "multithread7dlg.h"
以上**為 ccalculatethread 類新增了 wm_calculate 訊息,訊息的響應函式是 oncalculate,其功能是根據引數 wparam 的值,進行累加,累加結果在臨時變數ntmpt中,延時0.5秒,向主線程傳送wm_display訊息進行顯示,ntmpt作為引數傳遞。
>
多執行緒程式設計之三 執行緒間通訊
多執行緒程式設計之三 執行緒間通訊 七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說...
多執行緒程式設計之三 執行緒間通訊
七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於...
多執行緒程式設計之三 執行緒間通訊
多執行緒程式設計之三 執行緒間通訊 七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說...