天天看點

多線程程式設計之 ---線程間通訊

<a href="http://www.vckbase.com/code/downcode.asp?id=2973">下載下傳源代碼</a>

使用全局變量進行通信

由于屬于同一個程序的各個線程共享作業系統配置設定該程序的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于标準類型的全局變量,我們建議使用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中定義如下變量:

代表加數的大小。

分别輕按兩下三個單選按鈕,添加消息響應函數:

在MultiThread7Dlg.h中添加:

在MultiThread7Dlg.cpp中添加:

以上代碼使得主線程類CMultiThread7Dlg可以處理WM_DISPLAY消息,即在IDC_STATUS标簽框中顯示計算結果。

輕按兩下按鈕IDC_SUM,添加消息響應函數:

OnSum()函數的作用是建立CalculateThread線程,延時給該線程發送WM_CALCULATE消息。

右擊工程并選中“New Class…”為工程添加基類為 CWinThread 派生線程類 CCalculateThread。

在檔案CalculateThread.h 中添加

在檔案CalculateThread.cpp中添加

在CalculateThread.cpp檔案的開頭添加一條:

  以上代碼為 CCalculateThread 類添加了 WM_CALCULATE 消息,消息的響應函數是 OnCalculate,其功能是根據參數 wParam 的值,進行累加,累加結果在臨時變量nTmpt中,延時0.5秒,向主線程發送WM_DISPLAY消息進行顯示,nTmpt作為參數傳遞。

編譯并運作該例程,體會如何線上程間傳遞消息。

(未完待續)