[windows编程]多线程编程

值班系统 :发送传真+全局变量的使用

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. {
03. nAddend=10;
04. }
05.  
06. void CMultiThread7Dlg::OnRadio2()
07. {
08. nAddend=50;
09.  
10. }
11.  
12. void CMultiThread7Dlg::OnRadio3()
13. {
14. nAddend=100;
15.  
16. }

并在OnInitDialog函数中完成相应的初始化工作:

1. BOOL CMultiThread7Dlg::OnInitDialog()
2. {
3. ……
4. ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
5. nAddend=10;
6. ……

在MultiThread7Dlg.h中添加:

01. #include "CalculateThread.h"
02. #define WM_DISPLAY WM_USER+2
03. class CMultiThread7Dlg : public CDialog
04. {
05. // Construction
06. public:
07. CMultiThread7Dlg(CWnd* pParent = NULL); // standard constructor
08. CCalculateThread* m_pCalculateThread;
09. ……
10. protected:
11. int nAddend;
12. LRESULT OnDisplay(WPARAM wParam,LPARAM lParam);
13. ……

在MultiThread7Dlg.cpp中添加:

01. BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialog)
02. ……
03. ON_MESSAGE(WM_DISPLAY,OnDisplay)
04. END_MESSAGE_MAP()
05.  
06. LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam,LPARAM lParam)
07. {
08. int nTemp=(int)wParam;
09. SetDlgItemInt(IDC_STATUS,nTemp,FALSE);
10.  
11. return 0;
12.  
13. }

以上代码使得主线程类CMultiThread7Dlg可以处理WM_DISPLAY消息,即在IDC_STATUS标签框中显示计算结果。

双击按钮IDC_SUM,添加消息响应函数:

01. void CMultiThread7Dlg::OnSum()
02. {
03. m_pCalculateThread=
04. (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
05.  
06. Sleep(500);
07.  
08. m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
09. }

OnSum()函数的作用是建立CalculateThread线程,延时给该线程发送WM_CALCULATE消息。

右击工程并选中“New Class…”为工程添加基类为 CWinThread 派生线程类 CCalculateThread。

在文件CalculateThread.h 中添加

1. #define WM_CALCULATE WM_USER+1
2. class CCalculateThread : public CWinThread
3. {
4. ……
5. protected:
6. afx_msg LONG OnCalculate(UINT wParam,LONG lParam);
7. ……

在文件CalculateThread.cpp中添加

01. LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
02. {
03. int nTmpt=0;
04. for(int i=0;i<=(int)wParam;i++)
05. {
06. nTmpt=nTmpt+i;
07. }
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(CCalculateThread)
16. // NOTE - the ClassWizard will add and remove mapping macros here.
17. //}}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作为参数传递。

编译并运行该例程,体会如何在线程间传递消息。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值