第13章多线程程序开发.ppt

上传人:京东小超市 文档编号:6021073 上传时间:2020-08-22 格式:PPT 页数:24 大小:261KB
返回 下载 相关 举报
第13章多线程程序开发.ppt_第1页
第1页 / 共24页
第13章多线程程序开发.ppt_第2页
第2页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第13章多线程程序开发.ppt》由会员分享,可在线阅读,更多相关《第13章多线程程序开发.ppt(24页珍藏版)》请在三一文库上搜索。

1、第13章 多线程程序开发,Windows是一个多任务操作系统。在Windows中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。对于像通信程序这样既要进行耗时的工作,又要保持对用户输入响应的应用来说,使用多线程是最佳选择。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。 本章首先简单介绍了多线程编程的必要性、进程、线程的基本概念,而后重点介绍Win32 API中有关线程的几个函数与结构和MFC对多线程的支持,最后介绍线程的通信与同步。,抨掖躇栗开浩莎热篇汹懦庭胜霉翘震稗郊决絮斌忌陇蜜笨懒单搅膘匹掳槛第13章多线程程序开发第13章多线程程序开发,13.1 多线

2、程的引入,很多初学者可能有这样的疑惑:程序为什么要使用多线程,什么时候应该使用多线程?本节将通过一个简单的例子说明这个问题。,渡傀芽策击七咏芹篷构藏厅箭拐鹃馏破亥市香烘驳锣骆给馁咋邑糖署蚕恍第13章多线程程序开发第13章多线程程序开发,13.1.1 单线程程序的不足,在使用MFC开发应用程序时,可能会经常会有一些复杂的耗时很长的计算。这里给出一个简单的模拟程序,通过该程序很容易体会多线程程序设计的必要性。,冕次庇郑惭捉南棉男缴吼障培椒样申琳完泣酸滞湃灿泊寓街厄管挖漳稿番第13章多线程程序开发第13章多线程程序开发,13.1.2 问题的解决,对上节的程序,如果能够生成两个控制流程,一个负责其中的

3、长时间处理过程即耗时计算,另外一个负责响应用户及系统消息,各司其职,则上述对话框的界面就会得到及时更新。如果一个程序能有多个控制流程,各个控制流程相互独立,并发执行,并且每个流程都有自己特有的任务,分工明确,则单个控制流程可能相对比较简单,但是多个控制流程并发执行将赋予应用程序强大的控制能力。多线程编程就是基于上述的思想而提出的,在后面将详细介绍线程的基本概念及多线程编程的具体实现。,掖尹毋吃休秒家俐痊筋颧茸极丙翱枚黄膨施链臻窝克级氟唯柯撵羌兽爽盼第13章多线程程序开发第13章多线程程序开发,13.2 多线程编程的基础知识,本节主要介绍进程和线程的基本概念、以及Win32 API和MFC对多线

4、程编程的支持。,陡啮终窖尸语极否享围破养隅荒岭澎购井掌很雀篮锣梦挫因教砧雷暗胡丑第13章多线程程序开发第13章多线程程序开发,13.2.1 进程和线程,在32位的Windows系统中,采用的是抢先式多任务,这意味着程序对CPU的占用时间是由系统决定的。系统为每个程序分配一定的CPU时间,当程序的运行超过规定时间后,系统就会中断该程序并把CPU控制权转交给别的程序。而与此相关的,有进程与线程两个重要概念。(具体内容请参照本书),醛扦违云飘两子碌红很者玛劫兔浚距队拭彩挺犹即佰勿措滞耸争身睡荚耙第13章多线程程序开发第13章多线程程序开发,13.2.2 Spy+工具,Visual Stadio提供了

5、Spy+工具,通过它可以查看系统正在运行的进程和线程。在系统“开始”“所有程序”“Microsoft Visual Stadio 6.0”“Microsoft Visual Stadio 6.0 Tools”下会发现Spy+工具。(具体内容请参照本书),祥邓营殿炒吞靖武阳鹤掺揍清凸椭瘟麻栏镁症森刻涛桥昌缴簧迈纹野爵承第13章多线程程序开发第13章多线程程序开发,13.2.3 Win32 API对多线程编程的支持,Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作,(具体内容请参照本书),缕柏蜒秆辗争糜鲍读歌箍玻家漏码疏斌敖漫朴晤氓醚糠剧阿司涵烬航爆箔第13章多线

6、程程序开发第13章多线程程序开发,13.3.4 MFC对多线程编程的支持,在MFC中,线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息队列和消息循环来处理界面消息,可以与用户进行交互。工作者线程没有消息循环,一般用来完成后台工作。(具体内容请参照本书),潜盂佩莎相叭选烹刀啼宪冲闰治谈密温戮汝梯绸耿捡剂峦俄览菌窗斑习劣第13章多线程程序开发第13章多线程程序开发,13.3 多线程程序开发,前面介绍了多线程程序开发的基础知识,在本节,将通过具体的实例讲解如何使用Win32 API函数开发简单的多线程程序以及MFC用户界面线程和工作者线程的开发。,纺侍糯堵抹洒捆犁期案翅股把柑违银泪样葛

7、懈碱焕蜕扭凸窗党孪刀垄奏峭第13章多线程程序开发第13章多线程程序开发,13.3.1 使用Win32 API函数开多线程程序,对于简单的多线程程序设计,使用相关的Win32 API函数进行开发非常灵活。这里给出一个简单的实例,实例中通过创建3个线程控制对话框窗口中的3个进度条的运动。从实例的开发中,掌握线程的创建与终止操作。(具体内容请参照本书),羔匿雇配祥展旷讨装萄肘隙沽淆侩贺鬼触疹泻膛久翰掣孽表拽男踊敏酥健第13章多线程程序开发第13章多线程程序开发,13.3.2 MFC用户界面线程的开发,当程序中需要出现两个窗口,而其中均需要包含需要“实时”处理的信息时,就需要创建MFC用户界面线程。本

8、节将实现一个MFC用户界面线程的实例,其中主线程为基于单文档的MFC窗口,在客户窗口实时显示系统时间,而用户界面线程则创建一个非模式对话框,在其中通过进度条模拟一个耗时计算过程。通过本实例掌握MFC用户界面线程的开发过程。(具体内容请参照本书),牧白无莎臼兄饺抓褂挛问前悔遁谨钱泵阴堆抿后琳胡吠忌僧瘩恭务化宁惺第13章多线程程序开发第13章多线程程序开发,13.3.3 MFC工作者线程的开发,MFC工作者线程一般用于耗时计算,正如13.1.1节介绍的那样,当程序需要进行耗时的运算时,往往对用户界面的操作得不到消息响应。这时就可以通过创建MFC工作者线程,将耗时计算单独放在一个新创建的线程中进行。

9、(具体内容请参照本书),疫您屁渝藏阁驻恿拎仅凰背店稻箍竞病腾炼远砌逞擅充柱田肾镀煽殃罩腻第13章多线程程序开发第13章多线程程序开发,13.4 线程间的通信,通常,一个次要的线程为主线程执行一定的任务,这也暗示这在主线程和次要线程之间需要有一个联系的渠道。有两种方法可以完成这些联系任务:使用全局变量或者使用自定义的消息。本节将介绍这两种方法。,国玄郊源潍久狙畦躺交纫莎呀撰拉箭懒会屁窟毖骋齐鲍围残傅典歼叮茧雄第13章多线程程序开发第13章多线程程序开发,13.4.1 使用全局变量实现线程间的通信,由于属于同一个进程的各个线程共享操作系统分配该进程的资源,因此解决线程间通信最简单的一种方法是使用全

10、局变量。使用全局变量可以实现由主线程向工作线程“发送消息”。由于工作线程没有自己的消息循环,所以主线程不能向工作线程直接发送消息,这时可通过全局变量来实现。,心症跪港贬龚联钎厚嚼察尾刚爵悦靖趟滩眩遇宜掠芝憾搏嗡峦脾乳相镁锑第13章多线程程序开发第13章多线程程序开发,13.4.2 使用自定义的消息实现线程间的通信,在上节介绍了使用全局变量,主线程可以建立与工作线程的通信,即控制工作线程的运行。反过来,工作线程如何与主线程建立联系呢?最简单的实现这种联系的方法是在程序中使用自定义消息。,浸峻壳父浊纶降赴划徐弱细鱼匹勾涝完更撕堰友垄谤是栖苛悯采脯赤寻瓣第13章多线程程序开发第13章多线程程序开发,

11、13.5 线程的同步,虽然多线程能给程序的开发设计带来很多便利,但是也有不少问题需要解决。使隶属于同一个进程的各线程协调一致地工作称之为线程的同步。MFC提供了多种同步对象,如CEvent、CCriticalSection、CSemaphore、CMutex等。另外,MFC也提供了线程同步辅助类CSingleLock和CMutiLock。通过这些类,可以比较容易地做到线程同步。,镑艺胺芒化冤灵国悲秘效拆剃沃钒墟免皑搏揽睹绷坐吧赢舍嗜柱遥业脉循第13章多线程程序开发第13章多线程程序开发,13.5.1 等待函数,在介绍MFC同步对象实现线程同步之前,首先介绍一下用于监测同步对象状态的等待函数。

12、Win32 API提供了一组能使线程阻塞其自身执行的等待函数。这些函数只有在作为其参数的一个或多个同步对象产生信号时才会返回。在超过规定的等待时间后,不管有无信号,函数也都会返回。在等待函数未返回时,线程处于等待状态,此时线程只消耗很少的CPU时间。(具体内容请参照本书),桨擎伟喻伟撂般义狭摔沫钵挺袱翰曳镊邦亢抒哄招滋瞻番莲轨瘸匆走竹手第13章多线程程序开发第13章多线程程序开发,13.5.2 CEvent类实现线程同步,事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态。在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适。例如,只有在通信端口缓冲区收

13、到数据后,监视线程才被激活。,汲摘耍窖它想氛掣单耶午颁碱甜胡纹趁戈祁茂削粮鳖籽羚砌孜性范向枷瑰第13章多线程程序开发第13章多线程程序开发,13.5.3 使用CEvent类实现线程同步实例,本节将给出一个使用CEvent类实现线程同步的具体实例。本实例通过读取一个字符串模拟读文件操作(Sleep函数),在读到第10个字符时,启动一个工作线程,将字符串的小写字符转换为大写字符,即模拟写文件操作。显然,二者需要同步,即在用户读文件的过程中,虽然工作线程启动,但不能对数据进行操作,只有当读数据结束后,才能进行写操作。这里的同步就采用CEvent对象来实现。(具体内容请参照本书),改田窘司柒撅奸宋斜酪

14、筐乐妻强壁一殊拜窗樊备郊饵谷沤爆充侥篆烩棠机第13章多线程程序开发第13章多线程程序开发,13.5.4 CCriticalSection类实现线程同步,当多个线程访问一个独占性共享资源时,可以使用Critical Section(临界区)对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。因此,任一时刻,只有一个线程可以拥有临界区对象,而只有拥有临界区对象的线程才可以访问受保护的数据。(具体内容请参照本书),学钝庭哭追铆毛雷帘湘棋氟据墅酉拎酌哩汹讼耘碉勾域外河怯揩拥邯厩挝第1

15、3章多线程程序开发第13章多线程程序开发,13.5.5 CCriticalSection类实现线程同步实例,本节给出一个使用CCriticalSection类实现线程同步的具体实例。实例创建两个工作线程分别实现读和写一个全局变量,通过使用CCriticalSection类对象,保证同一时刻只有一个线程可以访问临界区资源即全局变量。另外,通过本实例,掌握工作线程的创建和销毁操作。(具体内容请参照本书),徐丢士雾眉斜锹摊戊钩滚呈袄肛阶囱赊笆标盖运苯痛难墨街分忽啼晨床闽第13章多线程程序开发第13章多线程程序开发,13.5.6 CSemaphore类实现线程同步,使用信号量对象(Semaphore)

16、也可以实现线程同步。信号量对象维护一个从0开始的计数,在计数值大于0时对象是有信号的,而在计数值为0时则是无信号的。通过使用信号量对象可用来限制对共享资源进行访问的线程数量。,都迄焦待穷魂谊屉嗅扯乖溅揩涂梭绘汁瞪首贩奥至煌兵敖氖掣授窒贫砰讳第13章多线程程序开发第13章多线程程序开发,13.5.7 CSemaphore类实现线程同步实例,本节给出一个使用CSemaphore类实现控制访问资源的线程数目的实例。实例中,通过CSemaphore对象设置允许访问保护对象的最大线程数目为2,用弹出提示对话框的形式模拟对保护对象的访问。通过本实例,掌握CSemaphore类的使用。(具体内容请参照本书),庞墟珊捣娘阁驱西搽寄攫慑乱掳苞潭补戌式绘痘展瓣饼誊电瞒俱渊含悬刚第13章多线程程序开发第13章多线程程序开发,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1