.3.4 线程间的通信
线程间的通信通常采用共享全局变量,共享存储区来实现。因为所有的线程都可以访问
这些资源。但是需要注意线程的同步,将在下一节做详细介绍。主线程不能通过发送消息给
辅助线程实现通信,但辅助线程可以通过发送自定义消息达到和主线程通信的目的。本节将
通过一个简单的实例,介绍使用共享存储区和自定义消息实现线程间通信的功能。
实例9-2:线程之间通信实例。源代码在光盘中“\09\实例9-2\IPCDemog”目录下。
(1)创建工程
首先利用VC++的AppWizard 创建一个基于对话框的应用程序(请参考第四章相关内
容)。所有设置都采用默认选项。
(2)添加资源
为新建的对话框添加一个编辑框控件,用来输入字符。代码如下:
CEdit m_input;
(3)添加变量
给对话框加入内存映shè文件句柄和视图的成员变量,代码如下:
HANDLE m_hFileMapping; // 内存映shè文件句柄
LPVOID m_pViewOfFile; // 内存映shè文件视图, 包含输入框的内容
BOOL m_bNotify; // 只有m_bNotify 为TRUE 时, OnChangeEditBox 才会工作
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·230·
(4)定义消息
注册自定义的消息WM_MyMessage,代码如下:
// 注册windows 消息
const UINT WM_MyMessage = RegisterWindowMessage(_T("MY_IPC_MESSAGE"));
(5)变量初始化
初始化内存映shè文件的大小和名称,代码如下:
// 内存映shè文件的大小
const DWORD dwMemoryFileSize = 4 * 1024;
// 内存映shè文件的名字
const LPCTSTR sMemoryFileNcom = _T("MY_IPC_SHAREMEMORY");
(6)对话框初始化
改写对话框的OnInitDialog 函数,进行初始化,代码如下:
BOOL CIPCDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……
// TODO: Add extra initialization here
// 保证文本框中的文本的大小比内存文件小
m_input.SetLimitText(dwMemoryFileSize - 1);
// 创建内存映shè文件
m_hFileMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, // 系统页面大小
NULL, // 安全属xìng
PAGE_READWRITE, // 保护方式
0