C++多线程编程(三)线程间通信
多线程编程之三——线程间通讯
作者:韩耀旭
原文地址:http://www.vckbase.com/document/viewdoc/?id=1707
七、线程间通讯
一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。
- 使用全局变量进行通信
由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用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中定义如下变量:
protected: int nAddend;
代表加数的大小。
分别双击三个单选按钮,添加消息响应函数:
并在OnInitDialog函数中完成相应的初始化工作:[cpp] view plaincopy- void CMultiThread7Dlg::OnRadio1()
- {
- nAddend=10;
- }
- void CMultiThread7Dlg::OnRadio2()
- {
- nAddend=50;
- }
- void CMultiThread7Dlg::OnRadio3()
- {
- nAddend=100;
- }
[c-sharp] view plaincopy- BOOL CMultiThread7Dlg::OnInitDialog()
- {
- ……
- ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
- nAddend=10;
- ……
在MultiThread7Dlg.h中添加:
[cpp] view plaincopy- #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标签框中显示计算结果。
- 双击按钮IDC_SUM,添加消息响应函数:
OnSum()函数的作用是建立CalculateThread线程,延时给该线程发送WM_CALCULATE消息。[cpp] view plaincopy
- void CMultiThread7Dlg::OnSum()
- {
- m_pCalculateThread=
- (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
- Sleep(500);
- m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
- }
- 右击工程并选中“New Class…”为工程添加基类为 CWinThread 派生线程类 CCalculateThread。
在文件CalculateThread.h 中添加
[cpp] view plaincopy- #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作为参数传递。
编译并运行该例程,体会如何在线程间传递消息。
(未完待续)
from:http://blog.csdn.net/yanpingsz/article/details/5891693
C++多线程编程(三)线程间通信的更多相关文章
- Java多线程编程(6)--线程间通信(下)
因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式. 在实际的软件开发过程中,经常会碰到如下场景 ...
- Java多线程编程核心技术---线程间通信(二)
通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...
- Java多线程编程核心技术---线程间通信(一)
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...
- Java多线程编程(5)--线程间通信
一.等待与通知 某些情况下,程序要执行的操作需要满足一定的条件(下文统一将其称之为保护条件)才能执行.在单线程编程中,我们可以使用轮询的方式来实现,即频繁地判断是否满足保护条件,若不满足则继续判断 ...
- iOS多线程编程之线程间的通信(转载)
一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 ...
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...
- [javaSE] 并发编程(线程间通信)
新建一个资源类Resource 定义成员变量String name 定义成员变量int age 新建一个输入类Input,实现Runnable接口 定义一个构造方法Input(),传入参数:Resou ...
- 《JAVA多线程编程核心技术》 笔记:第三章:线程间通信
一. 等待/通知机制:wait()和notify()1.1.使用的原因:1.2 具体实现:wait()和notify()1.2.1 方法wait():1.2.2 方法notify():1.2.3 wa ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
随机推荐
- liunx下NetworkManager导致网卡不能启动
前几天在客户现场,配置一台系统为redhat 6.0的服务器,这台服务器是IBM x3755,系统是预装的.在把服务器的IP地址配置完成后,使用命令不能启动网卡.提示:弹出界面 eht0:错误:激活链 ...
- Delphi Window 消息大全使用详解
WM_CTLCOLORSTATIC = $0138; 当一个静态控件将要被绘制时发送此消息给它的父窗口:通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色 ...
- 简洁的jsp
在开发 是使用tomcat7版本(7的jslt表达式语法检查更加严格) 1.去除生产html的不必要的空行 <%@ page trimDirectiveWhitespaces="tru ...
- 倒计时 NAN 问题
http://blog.csdn.net/lishangua/article/details/51506821
- C语言入门(21)——使用DBG对C语言进行调试
C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...
- Aix 文件名补齐及aix6.1 bash安装
Aix历史查询快捷键=>按ESC+k 设置KSH的自动补全(仅仅是文件名补全,没有命令补全)和历史命令功能 方法一: set -o vi 历史命令功能(esc -,esc +)自动补全文件名(e ...
- java快速排序1000万无序数组JVM-Xmx=256M 耗时2s
自己动手写排序算法,快速排序是比较不好写的了~ import java.util.*; class Test{ public void quickSort(int[] arr,int low,int ...
- Win7下unetbootin-windows-585工具制作Ubuntu12.04 U盘启动盘
1.下载unetbootin-windows-585工具,网址如下: unetbootin-windows-585 2.unetbootin-windows-585制作U盘启动盘 准备好1个4G的U盘 ...
- magento中的各种form标签
1. Text Field $fieldset->addField('title', 'text', array( 'label' => Mage::hel ...
- Mongo散记--聚合(aggregation)& 查询(Query)
mongo官网:http://www.mongodb.org/ 工作中使用到Mongo,可是没有系统的学习研究过Mongo,仅对工作过程中,在Mongo的使用过程中的一些知识点做一下记录,并随时补充, ...