欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年多线程编程基础 .pdf

    • 资源ID:30546980       资源大小:248.70KB        全文页数:35页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年多线程编程基础 .pdf

    多 线 程 编 程 之 一 问 题 提 出作 者 : 韩 耀 旭一 、 问 题 的 提 出编 写 一 个 耗 时 的 单 线 程 程 序 :新 建 一 个 基 于 对 话 框 的 应 用 程 序 SingleThread, 在 主 对 话 框IDD_SINGLETHREAD_DIALOG添 加 一 个 按 钮 , ID 为 IDC_SLEEP_SIX_SECOND,标 题 为 “ 延 时 6 秒 ” , 添 加 按 钮 的 响 应 函 数 , 代 码 如 下 :void CSingleThreadDlg:OnSleepSixSecond() Sleep(6000); /延时 6 秒 编 译 并 运 行 应 用 程 序 ,单 击 “ 延 时 6 秒 ” 按 钮 ,你 就 会 发 现 在 这 6 秒 期 间 程 序就 象 “ 死 机 ” 一 样 ,不 在 响 应 其 它 消 息 。为 了 更 好 地 处 理 这 种 耗 时 的 操 作 ,我 们 有必 要 学 习 多 线 程 编 程 。二 、 多 线 程 概 述进 程 和 线 程 都 是 操 作 系 统 的 概 念 。进 程 是 应 用 程 序 的 执 行 实 例 ,每 个 进 程 是由 私 有 的 虚 拟 地 址 空 间 、代 码 、数 据 和 其 它 各 种 系 统 资 源 组 成 ,进 程 在 运 行 过 程中 创 建 的 资 源 随 着 进 程 的 终 止 而 被 销 毁 , 所 使 用 的 系 统 资 源 在 进 程 终 止 时 被 释 放或 关 闭 。线 程 是 进 程 内 部 的 一 个 执 行 单 元 。系 统 创 建 好 进 程 后 ,实 际 上 就 启 动 执 行 了该 进 程 的 主 执 行 线 程 ,主 执 行 线 程 以 函 数 地 址 形 式 ,比 如 说 main或 WinMain函数 , 将 程 序 的 启 动 点 提 供 给 Windows系 统 。 主 执 行 线 程 终 止 了 , 进 程 也 就 随 之终 止 。每 一 个 进 程 至 少 有 一 个 主 执 行 线 程 ,它 无 需 由 用 户 去 主 动 创 建 ,是 由 系 统 自动 创 建 的 。用 户 根 据 需 要 在 应 用 程 序 中 创 建 其 它 线 程 ,多 个 线 程 并 发 地 运 行 于 同一 个 进 程 中 。一 个 进 程 中 的 所 有 线 程 都 在 该 进 程 的 虚 拟 地 址 空 间 中 ,共 同 使 用 这些 虚 拟 地 址 空 间 、全 局 变 量 和 系 统 资 源 ,所 以 线 程 间 的 通 讯 非 常 方 便 ,多 线 程 技术 的 应 用 也 较 为 广 泛 。多 线 程 可 以 实 现 并 行 处 理 , 避 免 了 某 项 任 务 长 时 间 占 用 CPU 时 间 。 要 说 明的 一 点 是 ,目 前 大 多 数 的 计 算 机 都 是 单 处 理 器( CPU)的 ,为 了 运 行 所 有 这 些 线程 , 操 作 系 统 为 每 个 独 立 线 程 安 排 一 些 CPU 时 间 , 操 作 系 统 以 轮 换 方 式 向 线 程提 供 时 间 片 ,这 就 给 人 一 种 假 象 ,好 象 这 些 线 程 都 在 同 时 运 行 。由 此 可 见 ,如 果两 个 非 常 活 跃 的 线 程 为 了 抢 夺 对 CPU 的 控 制 权 , 在 线 程 切 换 时 会 消 耗 很 多 的 CPU名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 35 页 - - - - - - - - - 资 源 , 反 而 会 降 低 系 统 的 性 能 。 这 一 点 在 多 线 程 编 程 时 应 该 注 意 。Win32 SDK函 数 支 持 进 行 多 线 程 的 程 序 设 计 , 并 提 供 了 操 作 系 统 原 理 中 的各 种 同 步 、 互 斥 和 临 界 区 等 操 作 。 Visual C+ 6.0中 , 使 用 MFC 类 库 也 实 现 了多 线 程 的 程 序 设 计 , 使 得 多 线 程 编 程 更 加 方 便 。三 、 Win32 API对 多 线 程 编 程 的 支 持Win32 提 供 了 一 系 列 的 API 函 数 来 完 成 线 程 的 创 建 、 挂 起 、 恢 复 、 终 结 以及 通 信 等 工 作 。 下 面 将 选 取 其 中 的 一 些 重 要 函 数 进 行 说 明 。1、 HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); 该 函 数 在 其 调 用 进 程 的 进 程 空 间 里 创 建 一 个 新 的 线 程 , 并 返 回 已 建 线 程 的 句 柄 ,其 中 各 参 数 说 明 如 下 :?lpThreadAttributes:指 向 一 个 SECURITY_ATTRIBUTES 结 构 的 指 针 ,该结 构 决 定 了 线 程 的 安 全 属 性 , 一 般 置 为 NULL ;?dwStackSize: 指 定 了 线 程 的 堆 栈 深 度 , 一 般 都 设 置 为 0;?lpStartAddress: 表 示 新 线 程 开 始 执 行 时 代 码 所 在 函 数 的 地 址 , 即 线 程 的起 始 地 址 。 一 般 情 况 为 (LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是 线 程 函 数 名 ;?lpParameter:指 定 了 线 程 执 行 时 传 送 给 线 程 的 32 位 参 数 ,即 线 程 函 数 的参 数 ;?dwCreationFlags: 控 制 线 程 创 建 的 附 加 标 志 , 可 以 取 两 种 值 。 如 果 该 参数 为 0, 线 程 在 被 创 建 后 就 会 立 即 开 始 执 行 ; 如 果 该 参 数 为CREATE_SUSPENDED,则 系 统 产 生 线 程 后 , 该 线 程 处 于 挂 起 状 态 , 并 不 马上 执 行 , 直 至 函 数 ResumeThread被 调 用 ;?lpThreadId: 该 参 数 返 回 所 创 建 线 程 的 ID ;如 果 创 建 成 功 则 返 回 线 程 的 句 柄 , 否 则 返 回 NULL 。2、 DWORD SuspendThread(HANDLE hThread); 该 函 数 用 于 挂 起 指 定 的 线 程 , 如 果 函 数 执 行 成 功 , 则 线 程 的 执 行 被 终 止 。3、 DWORD ResumeThread(HANDLE hThread); 该 函 数 用 于 结 束 线 程 的 挂 起 状 态 , 执 行 线 程 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 35 页 - - - - - - - - - 4、 VOID ExitThread(DWORD dwExitCode); 该 函 数 用 于 线 程 终 结 自 身 的 执 行 , 主 要 在 线 程 的 执 行 函 数 中 被 调 用 。 其 中 参 数dwExitCode用 来 设 置 线 程 的 退 出 码 。5、 BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode); 一 般 情 况 下 ,线 程 运 行 结 束 之 后 ,线 程 函 数 正 常 返 回 ,但 是 应 用 程 序 可 以 调用 TerminateThread强 行 终 止 某 一 线 程 的 执 行 。 各 参 数 含 义 如 下 :?hThread: 将 被 终 结 的 线 程 的 句 柄 ;?dwExitCode: 用 于 指 定 线 程 的 退 出 码 。使 用 TerminateThread()终 止 某 个 线 程 的 执 行 是 不 安 全 的 , 可 能 会 引 起 系 统不 稳 定 ;虽 然 该 函 数 立 即 终 止 线 程 的 执 行 ,但 并 不 释 放 线 程 所 占 用 的 资 源 。因 此 ,一 般 不 建 议 使 用 该 函 数 。6、 BOOL PostThreadMessage(DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam); 该 函 数 将 一 条 消 息 放 入 到 指 定 线 程 的 消 息 队 列 中 , 并 且 不 等 到 消 息 被 该 线 程 处 理时 便 返 回 。?idThread: 将 接 收 消 息 的 线 程 的 ID ;?Msg : 指 定 用 来 发 送 的 消 息 ;?wParam : 同 消 息 有 关 的 字 参 数 ;?lParam : 同 消 息 有 关 的 长 参 数 ;调 用 该 函 数 时 , 如 果 即 将 接 收 消 息 的 线 程 没 有 创 建 消 息 循 环 , 则 该 函 数 执 行 失 败 。四 、 Win32 API多 线 程 编 程 例 程例 程 1 MultiThread1 1.建 立 一 个 基 于 对 话 框 的 工 程 MultiThread1, 在 对 话 框IDD_MULTITHREAD1_DIALOG中 加 入 两 个 按 钮 和 一 个 编 辑 框 , 两 个 按 钮的 ID 分 别 是 IDC_START, IDC_STOP , 标 题 分 别 为 “ 启 动 ” , “ 停 止 ” ,IDC_STOP的 属 性 选 中 Disabled; 编 辑 框 的 ID 为 IDC_TIME , 属 性 选 中Read-only;2.在 MultiThread1Dlg.h文 件 中 添 加 线 程 函 数 声 明 :3.void ThreadFunc(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 35 页 - - - - - - - - - 注 意 , 线 程 函 数 的 声 明 应 在 类CMultiThread1Dlg的 外 部 。在 类CMultiThread1Dlg内 部 添 加 protected型 变 量 :HANDLE hThread; DWORD ThreadID; 分 别 代 表 线 程 的 句 柄 和 ID 。4.在 MultiThread1Dlg.cpp文 件 中 添 加 全 局 变 量 m_bRun :5.volatile BOOL m_bRun; m_bRun 代 表 线 程 是 否 正 在 运 行 。你 要 留 意 到 全 局 变 量 m_bRun 是 使 用 volatile 修 饰 符 的 ,volatile 修 饰符 的 作 用 是 告 诉 编 译 器 无 需 对 该 变 量 作 任 何 的 优 化 , 即 无 需 将 它 放 到 一 个寄 存 器 中 , 并 且 该 值 可 被 外 部 改 变 。 对 于 多 线 程 引 用 的 全 局 变 量 来 说 ,volatile 是 一 个 非 常 重 要 的 修 饰 符 。编 写 线 程 函 数 :void ThreadFunc() CTime time; CString strTime; m_bRun=TRUE; while(m_bRun) time=CTime:GetCurrentTime(); strTime=time.Format(%H:%M:%S); :SetDlgItemText(AfxGetMainWnd()-m_hWnd,IDC_TIME,strTime); Sleep(1000); 该 线 程 函 数 没 有 参 数 ,也 不 返 回 函 数 值 。只 要 m_bRun为 TRUE ,线 程 一直 运 行 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 35 页 - - - - - - - - - 双 击 IDC_START按 钮 , 完 成 该 按 钮 的 消 息 函 数 :void CMultiThread1Dlg:OnStart() / TODO: Add your control notification handler code here hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, NULL, 0, &ThreadID); GetDlgItem(IDC_START)-EnableWindow(FALSE); GetDlgItem(IDC_STOP)-EnableWindow(TRUE); 双 击 IDC_STOP按 钮 , 完 成 该 按 钮 的 消 息 函 数 :void CMultiThread1Dlg:OnStop() / TODO: Add your control notification handler code here m_bRun=FALSE; GetDlgItem(IDC_START)-EnableWindow(TRUE); GetDlgItem(IDC_STOP)-EnableWindow(FALSE); 编 译 并 运 行 该 例 程 , 体 会 使 用 Win32 API编 写 的 多 线 程 。例 程 2 MultiThread2 该 线 程 演 示 了 如 何 传 送 一 个 一 个 整 型 的 参 数 到 一 个 线 程 中 , 以 及 如 何 等 待 一个 线 程 完 成 处 理 。1.建 立 一 个 基 于 对 话 框 的 工 程 MultiThread2, 在 对 话 框IDD_MULTITHREAD2_DIALOG中 加 入 一 个 编 辑 框 和 一 个 按 钮 ,ID 分 别 是IDC_COUNT, IDC_START , 按 钮 控 件 的 标 题 为 “ 开 始 ” ;2.在 MultiThread2Dlg.h文 件 中 添 加 线 程 函 数 声 明 :3.void ThreadFunc(int integer); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 35 页 - - - - - - - - - 注 意 , 线 程 函 数 的 声 明 应 在 类 CMultiThread2Dlg的 外 部 。在 类 CMultiThread2Dlg内 部 添 加 protected型 变 量 : HANDLE hThread; DWORD ThreadID; 分 别 代 表 线 程 的 句 柄 和 ID 。4.打 开 ClassWizard,为 编 辑 框 IDC_COUNT添 加 int型 变 量 m_nCount。在MultiThread2Dlg.cpp文 件 中 添 加 :void ThreadFunc(int integer) int i; for(i=0;iEnableWindow(FALSE); WaitForSingleObject(hThread,INFINITE); GetDlgItem(IDC_START)-EnableWindow(TRUE); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 35 页 - - - - - - - - - 顺 便 说 一 下 WaitForSingleObject函 数 , 其 函 数 原 型 为 :DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); ohHandle为 要 监 视 的 对 象( 一 般 为 同 步 对 象 ,也 可 以 是 线 程 )的 句柄 ;odwMilliseconds为 hHandle对 象 所 设 置 的 超 时 值 , 单 位 为 毫 秒 ;当 在 某 一 线 程 中 调 用 该 函 数 时 , 线 程 暂 时 挂 起 , 系 统 监 视 hHandle所 指 向 的 对 象 的 状 态 。如 果 在 挂 起 的 dwMilliseconds毫 秒 内 ,线 程 所 等 待的 对 象 变 为 有 信 号 状 态 , 则 该 函 数 立 即 返 回 ; 如 果 超 时 时 间 已 经 到 达dwMilliseconds毫 秒 , 但 hHandle所 指 向 的 对 象 还 没 有 变 成 有 信 号 状 态 ,函 数 照 样 返 回 。 参 数 dwMilliseconds有 两 个 具 有 特 殊 意 义 的 值 : 0 和INFINITE。 若 为 0, 则 该 函 数 立 即 返 回 ; 若 为 INFINITE, 则 线 程 一 直 被挂 起 , 直 到 hHandle所 指 向 的 对 象 变 为 有 信 号 状 态 时 为 止 。本 例 程 调 用 该 函 数 的 作 用 是 按 下 IDC_START按 钮 后 , 一 直 等 到 线 程返 回 , 再 恢 复 IDC_START按 钮 正 常 状 态 。 编 译 运 行 该 例 程 并 细 心 体 会 。例 程 3 MultiThread3 传 送 一 个 结 构 体 给 一 个 线 程 函 数 也 是 可 能 的 , 可 以 通 过 传 送 一 个 指 向 结 构 体 的 指针 参 数 来 完 成 。 先 定 义 一 个 结 构 体 :typedef struct int firstArgu, long secondArgu, myType,*pMyType; 创 建 线 程 时CreateThread(NULL,0,threadFunc,pMyType,); 在 threadFunc函 数 内 部 , 可 以 使 用 “ 强 制 转 换 ” :int intValue=(pMyType)lpvoid)-firstArgu; long longValue=(pMyType)lpvoid)-seconddArgu; 例 程 3 MultiThread3将 演 示 如 何 传 送 一 个 指 向 结 构 体 的 指 针 参 数 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 35 页 - - - - - - - - - 1.建 立 一 个 基 于 对 话 框 的 工 程 MultiThread3, 在 对 话 框IDD_MULTITHREAD3_DIALOG中 加 入 一 个 编 辑 框 IDC_MILLISECOND, 一个 按 钮 IDC_START, 标 题 为 “ 开 始 ” , 一 个 进 度 条 IDC_PROGRESS1;2.打 开 ClassWizard, 为 编 辑 框 IDC_MILLISECOND添 加 int 型 变 量m_nMilliSecond, 为 进 度 条 IDC_PROGRESS1添 加 CProgressCtrl型 变 量m_ctrlProgress;3.在 MultiThread3Dlg.h文 件 中 添 加 一 个 结 构 的 定 义 :struct ThreadInfo UINT nMilliSecond; CProgressCtrl* pctrlProgress; ; 线 程 函 数 的 声 明 :UINT ThreadFunc(LPVOID lpParam ); 注 意 , 二 者 应 在 类 CMultiThread3Dlg的 外 部 。在 类 CMultiThread3Dlg内 部 添 加 protected型 变 量 : HANDLE hThread; DWORD ThreadID; 分 别 代 表 线 程 的 句 柄 和 ID 。4.在 MultiThread3Dlg.cpp文 件 中 进 行 如 下 操 作 :定 义 公 共 变 量ThreadInfo Info;双 击 按 钮 IDC_START, 添 加 相 应 消 息 处 理 函 数 :在 函 数 BOOL CMultiThread3Dlg:OnInitDialog()中 添 加 语 句 : / TODO: Add extra initialization here m_ctrlProgress.SetRange(0,99); m_nMilliSecond=10; UpdateData(FALSE); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 35 页 - - - - - - - - - return TRUE; / return TRUE unless you set the focus to a control 5.void CMultiThread3Dlg:OnStart() / TODO: Add your control notification handler code here UpdateData(TRUE); Info.nMilliSecond=m_nMilliSecond; Info.pctrlProgress=&m_ctrlProgress; hThread=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ThreadFunc, &Info , 0,&ThreadID); /* GetDlgItem(IDC_START)-EnableWindow(FALSE); WaitForSingleObject(hThread,INFINITE); GetDlgItem(IDC_START)-EnableWindow(TRUE); */ 6. 添 加 线 程 处 理 函 数 : UINT ThreadFunc(LPVOID lpParam) threadInfo* pInfo=(threadInfo*)lpParam; for(int i=0;inMilliSecond; pInfo-pctrlProgress-SetPos(i); Sleep(nTemp); return 0; 顺 便 补 充 一 点 ,如 果 你 在 void CMultiThread3Dlg:OnStart() 函 数 中添 加 /* */语 句 , 编 译 运 行 你 就 会 发 现 进 度 条 不 进 行 刷 新 , 主 线 程 也 停 止了 反 应 。 什 么 原 因 呢 ? 这 是 因 为WaitForSingleObject函 数 等 待 子 线 程( ThreadFunc) 结 束 时 , 导 致 了 线 程 死 锁 。 因 为 WaitForSingleObject函名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 35 页 - - - - - - - - - 数 会 将 主 线 程 挂 起 ( 任 何 消 息 都 得 不 到 处 理 ) , 而 子 线 程ThreadFunc正在 设 置 进 度 条 , 一 直 在 等 待 主 线 程 将 刷 新 消 息 处 理 完 毕 返 回 才 会 检 测 通 知事 件 。 这 样 两 个 线 程 都 在 互 相 等 待 , 死 锁 发 生 了 , 编 程 时 应 注 意 避 免 。例 程 4 MultiThread4 该 例 程 测 试 在 Windows下 最 多 可 创 建 线 程 的 数 目 。1.建 立 一 个 基 于 对 话 框 的 工 程 MultiThread4, 在 对 话 框IDD_MULTITHREAD4_DIALOG中 加 入 一 个 按 钮 IDC_TEST和 一 个 编 辑 框IDC_COUNT, 按 钮 标 题 为 “ 测 试 ” ,编 辑 框 属 性 选 中 Read-only;2.在 MultiThread4Dlg.cpp文 件 中 进 行 如 下 操 作 :添 加 公 共 变 量volatile BOOL m_bRunFlag=TRUE; 该 变 量 表 示 是 否 还 能 继 续 创 建 线 程 。添 加 线 程 函 数 :DWORD WINAPI threadFunc(LPVOID threadNum) while(m_bRunFlag) Sleep(3000); return 0; 只 要 m_bRunFlag 变 量 为 TRUE , 线 程 一 直 运 行 。双 击 按 钮 IDC_TEST, 添 加 其 响 应 消 息 函 数 :void CMultiThread4Dlg:OnTest() DWORD threadID; GetDlgItem(IDC_TEST)-EnableWindow(FALSE); long nCount=0; while(m_bRunFlag) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 35 页 - - - - - - - - - if(CreateThread(NULL,0,threadFunc,NULL,0,&threadID)=NULL) m_bRunFlag=FALSE; break; else nCount+; / 不 断 创建线 程 , 直到 再 不 能创 建 为 止m_nCount=nCount; UpdateData(FALSE); Sleep(5000); / 延 时 5 秒 , 等待所 有创 建的 线程 结束GetDlgItem(IDC_TEST)-EnableWindow(TRUE); m_bRunFlag=TRUE; 多线 程编 程 之 二MFC 中 的多 线 程 开发五 、 MFC 对 多 线 程 编 程 的 支 持MFC 中 有 两 类 线 程 ,分 别 称 之 为 工 作 者 线 程 和 用 户 界 面 线 程 。二 者 的 主 要 区别 在 于 工 作 者 线 程 没 有 消 息 循 环 , 而 用 户 界 面 线 程 有 自 己 的 消 息 队 列 和 消 息 循环 。工 作 者 线 程 没 有 消 息 机 制 ,通 常 用 来 执 行 后 台 计 算 和 维 护 任 务 ,如 冗 长 的 计算 过 程 ,打 印 机 的 后 台 打 印 等 。用 户 界 面 线 程 一 般 用 于 处 理 独 立 于 其 他 线 程 执 行之 外 的 用 户 输 入 ,响 应 用 户 及 系 统 所 产 生 的 事 件 和 消 息 等 。但 对 于 Win32的 API编 程 而 言 ,这 两 种 线 程 是 没 有 区 别 的 ,它 们 都 只 需 线 程 的 启 动 地 址 即 可 启 动 线 程来 执 行 任 务 。在 MFC 中 , 一 般 用 全 局 函 数 AfxBeginThread()来 创 建 并 初 始 化 一 个 线 程 的运 行 ,该 函 数 有 两 种 重 载 形 式 ,分 别 用 于 创 建 工 作 者 线 程 和 用 户 界 面 线 程 。两 种重 载 函 数 原 型 和 参 数 分 别 说 明 如 下 :(1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 35 页 - - - - - - - - - LPVOID pParam, nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL); PfnThreadProc:指 向 工 作 者 线 程 的 执 行 函 数 的 指 针 , 线 程 函 数 原 型 必 须 声 明 如下 :UINT ExecutingFunction(LPVOID pParam); 请 注 意 ,ExecutingFunction()应 返 回 一 个 UINT类 型 的 值 , 用 以 指 明 该 函 数 结 束的 原 因 。 一 般 情 况 下 , 返 回 0 表 明 执 行 成 功 。?pParam :传 递 给 线 程 函 数 的 一 个 32 位 参 数 ,执 行 函 数 将 用 某 种 方 式 解 释该 值 。 它 可 以 是 数 值 , 或 是 指 向 一 个 结 构 的 指 针 , 甚 至 可 以 被 忽 略 ;?nPriority: 线 程 的 优 先 级 。 如 果 为 0, 则 线 程 与 其 父 线 程 具 有 相 同 的 优 先级 ;?nStackSize:线 程 为 自 己 分 配 堆 栈 的 大 小 ,其 单 位 为 字 节 。如 果 nStackSize被 设 为 0, 则 线 程 的 堆 栈 被 设 置 成 与 父 线 程 堆 栈 相 同 大 小 ;?dwCreateFlags: 如 果 为 0, 则 线 程 在 创 建 后 立 刻 开 始 执 行 。 如 果 为CREATE_SUSPEND, 则 线 程 在 创 建 后 立 刻 被 挂 起 ;?lpSecurityAttrs: 线 程 的 安 全 属 性 指 针 , 一 般 为 NULL ;(2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL); pThreadClass 是 指 向 CWinThread 的 一 个 导 出 类 的 运 行 时 类 对 象 的 指 针 ,该 导 出 类 定 义 了 被 创 建 的 用 户 界 面 线 程 的 启 动 、退 出 等 ;其 它 参 数 的 意 义 同 形 式1。 使 用 函 数 的 这 个 原 型 生 成 的 线 程 也 有 消 息 机 制 , 在 以 后 的 例 子 中 我 们 将 发 现同 主 线 程 的 机 制 几 乎 一 样 。下 面 我 们 对 CWinThread类 的 数 据 成 员 及 常 用 函 数 进 行 简 要 说 明 。?m_hThread: 当 前 线 程 的 句 柄 ;?m_nThreadID:当 前 线 程 的 ID ;?m_pMainWnd: 指 向 应 用 程 序 主 窗 口 的 指 针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 35 页 - - - - - - - - - BOOL CWinThread:CreateThread(DWORD dwCreateFlags=0, UINT nStackSize=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL); 该 函 数 中 的 dwCreateFlags、 nStackSize、 lpSecurityAttrs参 数 和 API 函 数CreateThread中 的 对 应 参 数 有 相 同 含 义 , 该 函 数 执 行 成 功 , 返 回 非 0 值 , 否 则返 回 0。一 般 情 况 下 ,调 用 AfxBeginThread()来 一 次 性 地 创 建 并 启 动 一 个 线 程 ,但 是也 可 以 通 过 两 步 法 来 创 建 线 程 :首 先 创 建 CWinThread类 的 一 个 对 象 ,然 后 调 用该 对 象 的 成 员 函 数 CreateThread()来 启 动 该 线 程 。virtual BOOL CWinThread:InitInstance(); 重 载 该 函 数 以 控 制 用 户 界 面 线 程 实 例 的 初 始 化 。 初 始 化 成 功 则 返 回 非 0 值 ,否 则 返 回0 。 用 户 界 面 线 程 经 常 重 载 该 函 数 , 工 作 者 线 程 一 般 不 使 用InitInstance()。virtual int CWinThread:ExitInstance(); 在 线 程 终 结 前 重 载 该 函 数 进 行 一 些 必 要 的 清 理 工 作 。 该 函 数 返 回 线 程 的 退 出码 , 0 表 示 执 行 成 功 , 非 0 值 用 来 标 识 各 种 错 误 。 同 InitInstance()成 员 函 数 一样 , 该 函 数 也 只 适 用 于 用 户 界 面 线 程 。六 、 MFC 多 线 程 编 程 实 例在 Visual C+ 6.0编 程 环 境 中 , 我 们 既 可 以 编 写 C 风 格 的 32 位 Win32应用 程 序 , 也 可 以 利 用 MFC 类 库 编 写 C+ 风 格 的 应 用 程 序 , 二 者 各 有 其 优 缺 点 。基 于 Win32的 应 用 程 序 执 行 代 码 小 巧 , 运 行 效 率 高 , 但 要 求 程 序 员 编 写 的 代 码较 多 , 且 需 要 管 理 系 统 提 供 给 程 序 的 所 有 资 源 ; 而 基 于 MFC 类 库 的 应 用 程 序 可以 快 速 建 立 起 应 用 程 序 , 类 库 为 程 序 员 提 供 了 大 量 的 封 装 类 , 而 且 Developer Studio为 程 序 员 提 供 了 一 些 工 具 来 管 理 用 户 源 程 序 , 其 缺 点 是 类 库 代 码 很 庞 大 。由 于 使 用 类 库 所 带 来 的 快 速 、 简 捷 和 功 能 强 大 等 优 越 性 , 因 此 除 非 有 特 殊 的 需 要 ,否 则 Visual C+推 荐 使 用 MFC 类 库 进 行 程 序 开 发 。我 们 知 道 ,MFC 中 的 线 程 分 为 两 种 :用 户 界 面 线 程 和 工 作 者 线 程 。我 们 将 分 别 举例 说 明 。用 MFC 类库编 程实现 工作 者 线程例 程 5 MultiThread5 为 了 与 Win32 API对 照

    注意事项

    本文(2022年多线程编程基础 .pdf)为本站会员(Che****ry)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开