- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第13章多程程序开发
第13章 多线程程序开发 Windows是一个多任务操作系统。在Windows中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。对于像通信程序这样既要进行耗时的工作,又要保持对用户输入响应的应用来说,使用多线程是最佳选择。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。 本章首先简单介绍了多线程编程的必要性、进程、线程的基本概念,而后重点介绍Win32 API中有关线程的几个函数与结构和MFC对多线程的支持,最后介绍线程的通信与同步。 13.1 多线程的引入 很多初学者可能有这样的疑惑:程序为什么要使用多线程,什么时候应该使用多线程?本节将通过一个简单的例子说明这个问题。 13.1.1 单线程程序的不足 在使用MFC开发应用程序时,可能会经常会有一些复杂的耗时很长的计算。这里给出一个简单的模拟程序,通过该程序很容易体会多线程程序设计的必要性。 13.1.2 问题的解决 对上节的程序,如果能够生成两个控制流程,一个负责其中的长时间处理过程即耗时计算,另外一个负责响应用户及系统消息,各司其职,则上述对话框的界面就会得到及时更新。如果一个程序能有多个控制流程,各个控制流程相互独立,并发执行,并且每个流程都有自己特有的任务,分工明确,则单个控制流程可能相对比较简单,但是多个控制流程并发执行将赋予应用程序强大的控制能力。多线程编程就是基于上述的思想而提出的,在后面将详细介绍线程的基本概念及多线程编程的具体实现。 13.2 多线程编程的基础知识 本节主要介绍进程和线程的基本概念、以及Win32 API和MFC对多线程编程的支持。 13.2.1 进程和线程 在32位的Windows系统中,采用的是抢先式多任务,这意味着程序对CPU的占用时间是由系统决定的。系统为每个程序分配一定的CPU时间,当程序的运行超过规定时间后,系统就会中断该程序并把CPU控制权转交给别的程序。而与此相关的,有进程与线程两个重要概念。(具体内容请参照本书) 13.2.2 Spy++工具 Visual Stadio提供了Spy++工具,通过它可以查看系统正在运行的进程和线程。在系统“开始”→“所有程序”→“Microsoft Visual Stadio 6.0”→“Microsoft Visual Stadio 6.0 Tools”下会发现Spy++工具。(具体内容请参照本书) 13.2.3 Win32 API对多线程编程的支持 Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作,(具体内容请参照本书) 13.3.4 MFC对多线程编程的支持 在MFC中,线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息队列和消息循环来处理界面消息,可以与用户进行交互。工作者线程没有消息循环,一般用来完成后台工作。(具体内容请参照本书) 13.3 多线程程序开发 前面介绍了多线程程序开发的基础知识,在本节,将通过具体的实例讲解如何使用Win32 API函数开发简单的多线程程序以及MFC用户界面线程和工作者线程的开发。 13.3.1 使用Win32 API函数开多线程程序 对于简单的多线程程序设计,使用相关的Win32 API函数进行开发非常灵活。这里给出一个简单的实例,实例中通过创建3个线程控制对话框窗口中的3个进度条的运动。从实例的开发中,掌握线程的创建与终止操作。(具体内容请参照本书) 13.3.2 MFC用户界面线程的开发 当程序中需要出现两个窗口,而其中均需要包含需要“实时”处理的信息时,就需要创建MFC用户界面线程。本节将实现一个MFC用户界面线程的实例,其中主线程为基于单文档的MFC窗口,在客户窗口实时显示系统时间,而用户界面线程则创建一个非模式对话框,在其中通过进度条模拟一个耗时计算过程。通过本实例掌握MFC用户界面线程的开发过程。(具体内容请参照本书) 13.3.3 MFC工作者线程的开发 MFC工作者线程一般用于耗时计算,正如13.1.1节介绍的那样,当程序需要进行耗时的运算时,往往对用户界面的操作得不到消息响应。这时就可以通过创建MFC工作者线程,将耗时计算单独放在一个新创建的线程中进行。(具体内容请参照本书) 13.4 线程间的通信 通常,一个次要的线程为主线程执行一定的任务,这也暗示这在主线程和次要线程之间需要有一个联系的渠道。有两种方法可以完成这些联系任务:使用全局变量或者使用自定义的消息。本节将介绍这两种方法。 13.4.1 使用全局变量实现线程间的通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,因此解决线程间通信最简单的一种方法是使用全局变量。使用全局变量可以实现由主线程向工作线程“发送消息”。由于工作线程没有自己的消息循环,所以主
文档评论(0)