字体
第(3/6)页
关灯
   存书签 书架管理 返回目录
.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
上一页 目录 下一页