分类: C/C++
2010-03-09 10:39:07
七、线程间通讯
一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。
例程7 MultiThread7
该例程演示了如何使用自定义消息进行线程间通信。首先,主线程向CCalculateThread线程发送消息WM_CALCULATE,CCalculateThread线程收到消息后进行计算,再向主线程发送WM_DISPLAY消息,主线程收到该消息后显示计算结果。
protected: int nAddend;代表加数的大小。
void CMultiThread7Dlg::OnRadio1() { nAddend=10; } void CMultiThread7Dlg::OnRadio2() { nAddend=50; } void 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 class CMultiThread7Dlg : public CDialog { // Construction public: CMultiThread7Dlg(CWnd* pParent = NULL); // standard constructor CCalculateThread* m_pCalculateThread; …… protected: 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); return 0; }以上代码使得主线程类CMultiThread7Dlg可以处理WM_DISPLAY消息,即在IDC_STATUS标签框中显示计算结果。
void CMultiThread7Dlg::OnSum() { m_pCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread)); Sleep(500); m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL); }OnSum()函数的作用是建立CalculateThread线程,延时给该线程发送WM_CALCULATE消息。
#define WM_CALCULATE WM_USER+1 class CCalculateThread : public CWinThread { …… protected: afx_msg LONG OnCalculate(UINT wParam,LONG lParam); ……在文件CalculateThread.cpp中添加
LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam) { int nTmpt=0; for(int i=0;i<=(int)wParam;i++) { nTmpt=nTmpt+i; } Sleep(500); ::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL); return 0; } BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread) //{{AFX_MSG_MAP(CCalculateThread) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate) //和主线程对比,注意它们的区别 END_MESSAGE_MAP()在CalculateThread.cpp文件的开头添加一条:
#include "MultiThread7Dlg.h"以上代码为 CCalculateThread 类添加了 WM_CALCULATE 消息,消息的响应函数是 OnCalculate,其功能是根据参数 wParam 的值,进行累加,累加结果在临时变量nTmpt中,延时0.5秒,向主线程发送WM_DISPLAY消息进行显示,nTmpt作为参数传递。
(未完待续)