版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多线程编程之三线程间通讯 - VC知识库文章多线程编程之三 线程间通讯作者:韩耀旭下载源代码七、线程间通讯一般而言 , 应用程序中的一个次要线程总是为主线程执行特定的任务 , 这样 , 主线程和次要线程间必定有一个信息传递的渠 道 , 也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的, 下面将进行说明。1. 使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变 量。对于标准类型的全局变量,我们建议使用 volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无
2、需将它 放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传递指 向该结构的指针进行传递信息。2. 使用自定义消息我们可以在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。一个线程向另外一个线程发送消 息是通过操作系统实现的。利用 Windows 操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到 该消息,然后把该消息转发给目标线程,接收消息的线程必须已经建立了消息循环。例程 7 MultiThread7该例程演示了如何使用自定义消息进行线程间通信。首先,主线程向 CCalculateThread 线程发送消息
3、 WM_CALCULATE, CCalculateThread 线程收到消息后进行计算,再向主线程发送 WM_DISPLAY消息,主线程收到该消息后显示计算结果。1. 建立一个基于对话框的工程 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,属性选中 “ 边框 ” ;2. 在 MultiThr
4、ead7Dlg.h 中定义如下变量:protected:int nAddend;代表加数的大小。多线程编程之三线程间通讯 - VC知识库文章分别双击三个单选按钮,添加消息响应函数:void CMultiThread7Dlg:OnRadio1(nAddend=10;void CMultiThread7Dlg:OnRadio2(nAddend=50;void CMultiThread7Dlg:OnRadio3(nAddend=100;并在 OnInitDialog 函数中完成相应的初始化工作:BOOL CMultiThread7Dlg:OnInitDialog(CButton*GetDlgItem
5、(IDC_RADIO1->SetCheck(TRUE;nAddend=10;在 MultiThread7Dlg.h 中添加:#include "CalculateThread.h"#define WM_DISPLAY WM_USER+2class CMultiThread7Dlg : public CDialog/ Constructionpublic:CMultiThread7Dlg(CWnd* pParent = NULL; / standard constructor CCalculateThread* m_pCalculateThread;protected:
6、int nAddend;LRESULT OnDisplay(WPARAM wParam,LPARAM lParam;在 MultiThread7Dlg.cpp 中添加:BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialogON_MESSAGE(WM_DISPLAY,OnDisplay多线程编程之三线程间通讯 - VC知识库文章END_MESSAGE_MAP(LRESULT CMultiThread7Dlg:OnDisplay(WPARAM wParam,LPARAM lParamint nTemp=(intwParam;SetDlgItemInt(IDC_STA
7、TUS,nTemp,FALSE;return 0;以上代码使得主线程类 CMultiThread7Dlg 可以处理 WM_DISPLAY消息,即在 IDC_STATUS标签框中显示计算结果。 3. 双击按钮 IDC_SUM,添加消息响应函数:void CMultiThread7Dlg:OnSum(m_pCalculateThread=(CCalculateThread*AfxBeginThread(RUNTIME_CLASS(CCalculateThread;Sleep(500;m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAdd
8、end,NULL;OnSum(函数的作用是建立 CalculateThread 线程,延时给该线程发送 WM_CALCULATE消息。4. 右击工程并选中 “New Class” 为工程添加基类为 CWinThread 派生线程类 CCalculateThread。在文件 CalculateThread.h 中添加#define WM_CALCULATE WM_USER+1class CCalculateThread : public CWinThreadprotected:afx_msg LONG OnCalculate(UINT wParam,LONG lParam;在文件 Calcula
9、teThread.cpp 中添加LONG CCalculateThread:OnCalculate(UINT wParam,LONG lParamint nTmpt=0;for(int i=0;i<=(intwParam;i+nTmpt=nTmpt+i;Sleep(500;:PostMessage(HWND(GetMainWnd(->GetSafeHwnd(,WM_DISPLAY,nTmpt,NULL;多线程编程之三线程间通讯 - VC知识库文章return 0;BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread/AFX_MSG_MAP(CCalculateThread/ NOTE - the ClassWizard will add and remove mapping macros here. /AFX_MSG_MAPON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate/和主线程对比,注意它们的区别END_MESSAGE_MAP(在 CalculateThread.cpp 文件的开头添加一条:#include "MultiThread7Dlg.h"以上代码为 CCalculateThread 类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 监控服务合同的变更与终止情形探讨
- 房屋买卖合同的监管与维权
- 营业执照转让合同文本
- 企业保全服务合同范本
- 电力工程分包合同协议
- 内部劳务分包合同纠纷的解决方法
- 房屋买卖合同详尽指南
- 水果供应商采购合同模板
- 瓷砖促销活动购销合同
- 不锈钢购销合同范本
- 第5章 自动驾驶技术
- 国开经济法律基础形考任务国开电大《经济法律基础》形考任务3答案
- 水质监测运维方案样本
- 生命教育三年级下册
- 五金产品检验作业指导书
- 高压旋喷桩检测方案
- Unit1 My classroom Part A Lets spell(说课稿)-2022-2023学年英语四年级上册
- 【要点解读】《实践是检验真理的唯一标准》论证逻辑图
- 商务礼仪(山东联盟)知到章节答案智慧树2023年山东财经大学
- 跳绳兴趣小组活动总结
- 文物保护项目加固工程监理细则
评论
0/150
提交评论