多线程编程之三――线程间通讯_百度文库_第1页
多线程编程之三――线程间通讯_百度文库_第2页
多线程编程之三――线程间通讯_百度文库_第3页
多线程编程之三――线程间通讯_百度文库_第4页
多线程编程之三――线程间通讯_百度文库_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、七 、 线 程 间 通 讯一 般 而 言 , 应 用 程 序 中 的 一 个 次 要 线 程 总 是 为 主 线 程 执 行 特 定 的 任 务 , 这 样 , 主 线 程 和 次 要 线 程 间 必 定 有 一 个 信 息 传 递 的 渠 道 , 也 就 是 主 线 程 和 次 要 线 程 间 要 进 行 通 信 。这 种 线 程 间 的 通 信 不 但 是 难 以 避 免 的 ,而 且 在 多 线 程 编 程 中 也 是 复 杂 和 频 繁 的 , 下 面 将 进 行 说 明 。1使 用 全 局 变 量 进 行 通 信由 于 属 于 同 一 个 进 程 的 各 个 线 程 共 享 操 作

2、系 统 分 配 该 进 程 的 资 源 , 故 解 决 线 程 间 通 信 最 简 单 的 一 种 方 法 是 使 用 全 局 变 量 。 对 于 标 准 类 型 的 全 局 变 量 , 我 们 建 议 使 用 volatil e 修 饰 符 , 它 告 诉 编 译 器 无 需 对 该 变 量 作 任 何 的 优 化 , 即 无 需 将 它 放 到 一 个 寄 存 器 中 , 并 且 该 值 可 被 外 部 改 变 。 如 果 线 程 间 所 需 传 递 的 信 息 较 复 杂 , 我 们 可 以 定 义 一 个 结 构 , 通 过 传 递 指 向 该 结 构 的 指 针 进 行 传 递 信

3、息 。2使 用 自 定 义 消 息我 们 可 以 在 一 个 线 程 的 执 行 函 数 中 向 另 一 个 线 程 发 送 自 定 义 的 消 息 来 达 到 通 信 的 目 的 。 一 个 线 程 向 另 外 一 个 线 程 发 送 消 息 是 通 过 操 作 系 统 实 现 的 。 利 用 Windows 操 作 系 统 的 消 息 驱 动 机 制 ,当 一 个 线 程 发 出 一 条 消 息 时 , 操 作 系 统 首 先 接 收 到 该 消 息 , 然 后 把 该 消 息 转 发 给 目 标 线 程 , 接 收 消 息 的 线 程 必 须 已 经 建 立 了 消 息 循 环 。例 程

4、 7MultiThread7该 例 程 演 示 了 如 何 使 用 自 定 义 消 息 进 行 线 程 间 通 信 。 首 先 , 主 线 程 向 CCalculateThread 线 程 发 送 消 息 WM_CALCULATE, CCalculateThread 线 程 收 到 消 息 后 进 行 计 算 , 再 向 主 线 程 发 送 WM_DISPLAY消 息 , 主 线 程 收 到 该 消 息 后 显 示 计 算 结 果 。3建 立 一 个 基 于 对 话 框 的 工 程 MultiThread7, 在 对 话 框 IDD_MULTITHREAD7_DIALOG中 加 入 三 个 单

5、 选 按 钮 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, 属 性 选 中 “ 边 框 ” ;4在 MultiThread7Dlg.h 中 定 义 如 下 变 量 :protected:int nAddend;5代 表 加 数 的 大 小 。分 别 双 击 三 个 单 选 按 钮 , 添 加 消 息 响 应 函 数 :void CMultiT hread7Dl

6、g:OnRadio1(nAddend=10;void CMultiT hread7Dlg:OnRadio2(nAddend=50;void CMultiT hread7Dlg:OnRadio3(nAddend=100;6并 在 OnInitDialog 函 数 中 完 成 相 应 的 初 始 化 工 作 : BOOL CMultiThread7Dlg:OnInitDialog(CButton*GetDlgItem(IDC_RADIO1->SetCheck(TRUE;nAddend=10;7在 MultiThread7Dlg.h 中 添 加 :#include"Calculate

7、Thread.h"#defineWM_DISPLAYWM_USER+2class CMultiT hread7Dlg :public CDialog/Constructionpublic:CMultiThread7Dlg(CWnd*pParent =NULL; /standard constructor CCalculateThread*m_pCalculateThread;protected:int nAddend;LRESULT OnDisplay (WPARAMwParam,LPARAM lParam;8在 MultiThread7Dlg.cpp 中 添 加 :BEGIN_ME

8、SSAGE_MAP(CMultiThread7Dlg,CDialogON_MESSAGE(WM_DISPLAY,OnDisplayEND_MESSAGE_MAP(LRESULT CMultiT hread7Dlg:OnDisplay (WPARAMwParam,LPARAM lParam int nTemp=(intwParam;SetDlgItemInt(IDC_STATUS,nTemp,FALSE;return 0;9以 上 代 码 使 得 主 线 程 类 CMultiThread7Dlg 可 以 处 理 WM_DISPLAY消 息 , 即 在 IDC_STATUS标 签 框 中 显 示

9、计 算 结 果 。10双 击 按 钮 IDC_SUM, 添 加 消 息 响 应 函 数 :void CMultiT hread7Dlg:OnSum(m_pCalculateThread=(CCalculateThread*AfxBeginThread(RUNTIME_CLASS(CCalculateThread;Sleep(500;m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL; 11OnSum(函 数 的 作 用 是 建 立 CalculateThread 线 程 , 延 时 给 该 线 程 发 送 WM_

10、CALCULATE消 息 。12右 击 工 程 并 选 中 “ New Clas s ” 为 工 程 添 加 基 类 为 CWinThread 派 生 线 程 类 CCalculateThread 。在 文 件 CalculateThread.h 中 添 加#defineWM_CALCULATEWM_USER+1class CCalculateThread :public CWinThreadprotected:afx_msgLONG OnCalculate(UINT wParam,LONG lParam;13在 文 件 CalculateThread.cpp 中 添 加LONG CCalcu

11、lateThread:OnCalculate(UINTwParam,LONG lParamint nTmpt=0;for(inti=0;i<=(intwParam;i+nTmpt=nTmpt+i; Sle ep(500; :PostMes sage( (H WND (Ge tMai nWnd(->GetSafe Hw nd(,W M_D ISPLAY,n Tmpt,NULL; return 0; BEGIN _MESSAGE_MA P(C Calc ula teThread, CWinThread /AFX_MSG_MA P(C C alc ulateThread / NOTE -

12、 the Class Wiz ard will add and remove mapping mac ros here. /AFX_MSG_MA P ON_THREAD _MESSAGE(W M_C ALCULATE,OnCalc ulate / 和 主 线 程 对 比 , 注 意 它 们 的 区 别 END _MESSAGE_MAP( 14 在 Calc ulateThread.c pp 文 件 的 开 头 添 加 一 条 : #inc lude "MultiThread7D lg.h" 15 以上代码为 CCalc ula teThread 类 添 加 了 WM_CALC ULATE 消

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论