七つのスレッド間通信
一般に、二次スレッドのアプリケーションは、常にメインスレッド及び二次スレッド間で情報の伝送のためのチャンネルを持っている必要があり、そのようになるようにメインスレッド及び二次スレッド間、つまり、特定のタスクを実行するためにメインスレッドであります通信。このスレッド間の通信だけでなく、避けられないだけでなく、マルチスレッドプログラミングが複雑で頻繁に、以下に説明します。
- 通信するためのグローバル変数の使用
により、さまざまなスレッドには、プロセスにリソースを割り当てるために同じオペレーティング・システムに属するプロセスを共有し、それを解決するためのスレッド間通信、最も簡単な方法は、グローバル変数を使用することです。標準型のグローバル変数のために、我々は変数がレジスタにそれを配置する必要はありません任意の最適化を行う必要はありませんコンパイラに指示volatile修飾子の使用を推奨し、その値を外部から変更することができます。必要な情報は、より複雑なスレッド間で転送された場合、我々は構造を定義することができ、情報を構造体へのポインタを渡すことによって渡されます。 - カスタムメッセージを使用
して、我々は別のスレッドにカスタムスレッドを送信すると、メッセージ通信の目的を達成するための機能を実行します。スレッドが別のスレッドにメッセージを送信するためにオペレーティング・システムによって実装します。スレッドは、オペレーティング・システムは、最初のメッセージを受信し、ターゲットスレッドにメッセージを転送するメッセージを発行したときに、Windowsオペレーティングシステムのためのメッセージ駆動型メカニズムの使用は、スレッドは、メッセージがメッセージループを確立しておく必要があります受け取ります。
日常7 MultiThread7
この例では、スレッド間通信のためのカスタムメッセージを使用する方法を示します。まず、メインスレッドがメッセージスレッドを受信した後に計算されたメッセージスレッドCCalculateThread WM_CALCULATE、CCalculateThreadを送信し、メインスレッドが再びWM_DISPLAYメッセージを送信し、そのメッセージを受信した後に計算され、メインスレッドを示しています。
- IDC_RADIO1、IDC_RADIO2、IDC_RADIO3、タイトル内のダイアログボックスIDD_MULTITHREAD7_DIALOGに3つのラジオボタンを追加する、プロジェクトベースのダイアログMultiThread7を確立した1 + 2 + 3 + 4 + 2 + ... + 10,1 +を3 + ... + 50、1 + 4 + 4 + 3 + 2 + ... + 100。題しボタンIDC_SUM、参加「和」。ラベルボックスIDC_STATUS、財産に参加し、「境界線」を選択します。
- MultiThread7Dlg.hを次のように変数が定義されています。
保護: nAddendをint型。
これは、加数の大きさを表しています。
ダブル3つのラジオボタンは、それぞれ、メッセージ応答機能を追加します。無効CMultiThread7Dlg :: OnRadio1() { nAddend = 10。 } ボイドCMultiThread7Dlg :: OnRadio2() { nAddend = 50。 } ボイドCMultiThread7Dlg :: OnRadio3() { nAddend = 100。 }
そして、のOnInitDialogで初期化機能を実行します。BOOL CMultiThread7Dlg ::のOnInitDialog() { ...... ((CButton *)GetDlgItem(IDC_RADIO1)) - > SETCHECK(TRUE)。 nAddend = 10。 ......
MultiThread7Dlg.hに追加しました:#include "CalculateThread.h" の#define WM_DISPLAY WM_USER + 2 クラスCMultiThread7Dlg:公共CDialogの { //建設 公共: CMultiThread7Dlg(CWndの* pParent = NULL); //標準のコンストラクタ CCalculateThread * m_pCalculateThread。 ...... 保護: int型nAddend。 LRESULT OnDisplay(WPARAMのwParam、LPARAM lParamに)。 ......
MultiThread7Dlg.cppに追加しました:BEGIN_MESSAGE_MAP(CMultiThread7Dlg、CDialogの) ...... ON_MESSAGE(WM_DISPLAY、OnDisplay) END_MESSAGE_MAP() LRESULT CMultiThread7Dlg :: OnDisplay(WPARAMのwParam、LPARAM lParamに) { int型nTemp =(INT)のwParam。 SetDlgItemInt(IDC_STATUS、nTemp、FALSE)。 0を返します。 }
上記のコードメインスレッドクラスCMultiThread7Dlg WM_DISPLAYメッセージを処理できるように、すなわち、IDC_STATUSラベルボックスの計算結果を表示します。 - メッセージ応答機能を追加し、ボタンIDC_SUMをダブルクリックします。
ボイドCMultiThread7Dlg :: OnSum() { m_pCalculateThread = (CCalculateThread *)AfxBeginThread(RUNTIME_CLASS(CCalculateThread))。 スリープ(500); m_pCalculateThread-> PostThreadMessage(WM_CALCULATE、nAddend、NULL); }
アクションOnSum()関数は、CalculateThreadスレッド、メッセージを遅らせるためにWM_CALCULATEを送信するスレッドを確立することです。 - プロジェクトを右クリックし、「...新しいクラス」を選択するのCWinThreadスレッドクラスCCalculateThreadを得ているプロジェクトの基本クラスを追加します。
ファイルに追加CalculateThread.h#define WM_CALCULATE WM_USER + 1 クラスCCalculateThread:公共のCWinThread { ...... 保護: AFX_MSG LONG OnCalculate(UINTのwParam、LONG lParamに)。 ......
ファイルCalculateThread.cppに追加LONG CCalculateThread :: OnCalculate(UINTのwParam、LONG lParamに) { int型nTmpt = 0。 以下のために(INT i = 0; iが<=(INT)のwParam; iは++) { nTmpt = nTmpt + I。 } スリープ(500)。 ::のPostMessage((HWND)(GetMainWnd() - > GetSafeHwnd())、WM_DISPLAY、nTmpt、NULL); 0を返します。 } BEGIN_MESSAGE_MAP(CCalculateThread、のCWinThread) // {{AFX_MSG_MAP(CCalculateThread) // NOTE - ClassWizardがここにマッピングマクロを追加および削除します。 //}} AFX_MSG_MAP ON_THREAD_MESSAGE(WM_CALCULATE、OnCalculate) //和主线程对比、注意它们的区别 END_MESSAGE_MAP()
ファイルの先頭にCalculateThread.cppを追加します。#include "MultiThread7Dlg.h"
WM_CALCULATEメッセージ上方CCalculateThreadクラスコードを追加し、メッセージは、パラメータwParamに、累積の値の関数であるOnCalculate応答関数は、であり、一時的な変数nTmpt、遅延における積算結果0.5秒、メインスレッドWM_DISPLAYディスプレイにメッセージを送信します、nTmptは、パラメータとして渡されました。
(つづきます)
ます。https://www.cnblogs.com/rogee/archive/2011/03/22/1990899.htmlで再現