多线程程序开发_第1页
多线程程序开发_第2页
多线程程序开发_第3页
多线程程序开发_第4页
多线程程序开发_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

多线程程序开发13.1多线程的引入很多初学者可能有这样的疑惑:程序为什么要使用多线程,什么时候应该使用多线程?本节将通过一个简单的例子说明这个问题。13.1.1单线程程序的不足在使用MFC开发应用程序时,可能会经常会有一些复杂的耗时很长的计算。这里给出一个简单的模拟程序,通过该程序很容易体会多线程程序设计的必要性。13.1.2问题的解决对上节的程序,如果能够生成两个控制流程,一个负责其中的长时间处理过程即耗时计算,另外一个负责响应用户及系统消息,各司其职,则上述对话框的界面就会得到及时更新。如果一个程序能有多个控制流程,各个控制流程相互独立,并发执行,并且每个流程都有自己特有的任务,分工明确,则单个控制流程可能相对比较简单,但是多个控制流程并发执行将赋予应用程序强大的控制能力。多线程编程就是基于上述的思想而提出的,在后面将详细介绍线程的基本概念及多线程编程的具体实现。13.2多线程编程的基础知识本节主要介绍进程和线程的基本概念、以及Win32API和MFC对多线程编程的支持。13.2.1进程和线程在32位的Windows系统中,采用的是抢先式多任务,这意味着程序对CPU的占用时间是由系统决定的。系统为每个程序分配一定的CPU时间,当程序的运行超过规定时间后,系统就会中断该程序并把CPU控制权转交给别的程序。而与此相关的,有进程与线程两个重要概念。(具体内容请参照本书)13.2.2Spy++工具VisualStadio提供了Spy++工具,通过它可以查看系统正在运行的进程和线程。在系统“开始”→“所有程序”→“MicrosoftVisualStadio6.0”→“MicrosoftVisualStadio6.0Tools”下会发现Spy++工具。(具体内容请参照本书)13.2.3Win32API对多线程编程的支持Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作,(具体内容请参照本书)13.3.4MFC对多线程编程的支持在MFC中,线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息队列和消息循环来处理界面消息,可以与用户进行交互。工作者线程没有消息循环,一般用来完成后台工作。(具体内容请参照本书)13.3多线程程序开发前面介绍了多线程程序开发的基础知识,在本节,将通过具体的实例讲解如何使用Win32API函数开发简单的多线程程序以及MFC用户界面线程和工作者线程的开发。13.3.1使用Win32API函数开多线程程序对于简单的多线程程序设计,使用相关的Win32API函数进行开发非常灵活。这里给出一个简单的实例,实例中通过创建3个线程控制对话框窗口中的3个进度条的运动。从实例的开发中,掌握线程的创建与终止操作。(具体内容请参照本书)13.3.2MFC用户界面线程的开发当程序中需要出现两个窗口,而其中均需要包含需要“实时”处理的信息时,就需要创建MFC用户界面线程。本节将实现一个MFC用户界面线程的实例,其中主线程为基于单文档的MFC窗口,在客户窗口实时显示系统时间,而用户界面线程则创建一个非模式对话框,在其中通过进度条模拟一个耗时计算过程。通过本实例掌握MFC用户界面线程的开发过程。(具体内容请参照本书)13.3.3MFC工作者线程的开发MFC工作者线程一般用于耗时计算,正如节介绍的那样,当程序需要进行耗时的运算时,往往对用户界面的操作得不到消息响应。这时就可以通过创建MFC工作者线程,将耗时计算单独放在一个新创建的线程中进行。(具体内容请参照本书)13.4线程间的通信通常,一个次要的线程为主线程执行一定的任务,这也暗示这在主线程和次要线程之间需要有一个联系的渠道。有两种方法可以完成这些联系任务:使用全局变量或者使用自定义的消息。本节将介绍这两种方法。13.4.1使用全局变量实现线程间的通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,因此解决线程间通信最简单的一种方法是使用全局变量。使用全局变量可以实现由主线程向工作线程“发送消息”。由于工作线程没有自己的消息循环,所以主线程不能向工作线程直接发送消息,这时可通过全局变量来实现。13.4.2使用自定义的消息实现线程间的通信在上节介绍了使用全局变量,主线程可以建立与工作线程的通信,即控制工作线程的运行。反过来,工作线程如何与主线程建立联系呢?最简单的实现这种联系的方法是在程序中使用自定义消息。13.5线程的同步虽然多线程能给程序的开发设计带来很多便利,但是也有不少问题需要解决。使隶属于同一个进程的各线程协调一致地工作称之为线程的同步。MFC提供了多种同步对象,如CEvent、CCriticalSection、CSemaphore、CMutex等。另外,MFC也提供了线程同步辅助类CSingleLock和CMutiLock。通过这些类,可以比较容易地做到线程同步。13.5.1等待函数在介绍MFC同步对象实现线程同步之前,首先介绍一下用于监测同步对象状态的等待函数。Win32API提供了一组能使线程阻塞其自身执行的等待函数。这些函数只有在作为其参数的一个或多个同步对象产生信号时才会返回。在超过规定的等待时间后,不管有无信号,函数也都会返回。在等待函数未返回时,线程处于等待状态,此时线程只消耗很少的CPU时间。(具体内容请参照本书)13.5.2CEvent类实现线程同步事件对象(Event)是最简单的同步对象,它包括有信号和无信号两种状态。在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适。例如,只有在通信端口缓冲区收到数据后,监视线程才被激活。13.5.3使用CEvent类实现线程同步实例本节将给出一个使用CEvent类实现线程同步的具体实例。本实例通过读取一个字符串模拟读文件操作(Sleep函数),在读到第10个字符时,启动一个工作线程,将字符串的小写字符转换为大写字符,即模拟写文件操作。显然,二者需要同步,即在用户读文件的过程中,虽然工作线程启动,但不能对数据进行操作,只有当读数据结束后,才能进行写操作。这里的同步就采用CEvent对象来实现。(具体内容请参照本书)13.5.4CCriticalSection类实现线程同步当多个线程访问一个独占性共享资源时,可以使用CriticalSection(临界区)对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。因此,任一时刻,只有一个线程可以拥有临界区对象,而只有拥有临界区对象的线程才可以访问受保护的数

温馨提示

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

评论

0/150

提交评论