浅议VisualC 多线程设计

2008-04-09 04:09:08来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费)

  1 引言

  随着Windows操作系统的发展,Windows95 和WindowsNT 操作系统开始支持多任务的调度和处理。基于此,其所提供的多任务空间使程序员可以完全控制应用程序中细节的运行,从而编写高效率的应用程序。

  多任务的实现基于两方面,即多进程和多线程。所谓进程是指在系统中正在运行的一个应用程序,而线程是系统分配处理器时间资源的基本单元,也可讲是进程之内独立执行的一个单元。利用多线程技术,在VC环境下使一个进程从主线程的执行开始进而创建一个或多个附加线程,达到多线程多任务的实现。

  2 多线程及其设计思路

  在Windows操作系统中,Win32应用程序可以在Windows平台上运行多个实例,每个应用程序实例都是一个独立的进程,而一个进程可以由不止一个线程来实现。与Win16应用程序的协同多任务方式不同,Win32应用程序组采取的是抢占式多任务方式,即同时执行多个进程和多个线程。线程具体讲是一个代码单元,在操作系统中运行是标志着代码运行流。

  每个进程都有私有的虚拟地址空间,进程的所有线程共享同一地址空间。每个线程被CPU分配一个时间片,一旦被激活,它正常运行直到时间片耗尽并被挂起,此时,操作系统选择另一个线程进行运行。通过时间片轮转,又出于各个时间片很小(20毫秒级),看起来就像多个线程同时在工作。实际上,只有在多处理器系统上才是真正的在可得到的处理器上同时运行多个线程。基于Win32的应用程序可以通过把给定进程分解(或创建)多个线程挖掘潜在的CPU时间,而且还可以加强应用程序,以使用户提高效率,加强反应能力以及进行后台辅助处理。

  对于一个进程来说,当应用程序有几个任务要同时运行时,建立多个线程是有用的。如打印时,利用多线程机制实现多线程,就可在需要打印时创建一个负责完成打印功能的打印线程。创建打印线程之后,系统就变成了多线程。当进行打印时,CPU轮换着分配给这两个线程时间片,所以打印和其他功能一起同时在运行,这就充分利用了CPU处理打印工作之外的空闲时间片,并且避免了用户长久地等待打印时间。这就是所谓的由多线程来实现的多任务,在进行打印任务的同时又可以进行别的任务。

  在VC中利用MFC编程时,线程被分为工作者线程(Worker Thread)和用户界面线程(User Interface Thread)两大类。前者常用于处理后台任务,执行这些后台任务并不会耽搁用户对应用程序的使用,即用户操作无需等待后台任务的完成。后者常用来独立的处理用户输入和相应用户的事件。其中用户界面线程的特点是拥有单独的消息队列,可以具有自己的窗口界面,能够对用户输入和事件做出响应。在应用程序中,根据用户界面线程具有消息队列这一特点,可以使之循环等待某一事件发生后再进行处理。由于Windows95时抢先式多任务的操作系统,即使一个线程因等待某事件而阻塞,其他线程仍然可以继续执行。


  3 多线程的调度和处理

  在32 位Windows 环境下,开发多线程应用程序可以利用提供的Win32 API 接口函数,也可以利用VC 中提供的MFC类库进行开发。两种方式对于多线程编程原理是一样的,用户可以根据需要选择相应的工具。下面以利用MFC 类库实现多线程调度与处理为例,介绍多线程的实现方法以及多个线程间任务调度所应注意的一些关键技术。

  3.1 基于MFC的多线程设计

  在VC 6.0环境下,MFC类库提供了对多线程编程支持,使得多线程能方便的实现。MFC区分两种类型的线程:辅助线程(Worker Thread)和用户界面线程(UserInterface Thread)。辅助线程没有消息机制,通常用来执行后台计算和维护任务。MFC 为用户界面线程提供消息机制,用来处理用户的输入,响应用户产生的事件和消息。但对于Win32 的API 来说,这两种线程并没有区别,它只需要线程的启动地址以便启动线程执行任务。用户界面线程的一个典型应用就是类CWinApp,类CwinApp是CWinThread 类的派生类,应用程序的主线程是由它提供,并由它负责处理用户产生的事件和消息。

  类CwinThread 是用户接口线程的基本类。CWinThread 的对象用以维护特定线程的局部数据。因为处理线程局部数据依赖于类CWinThread,所以所有使用MFC 的线程都必须由MFC 来创建。

  3.2 多线程的创建及涉及的关键问题

  要创建一个线程,需要调用函数AfxBeginThread。该函数通过参数重载可以实现辅助线程和用户界面线程的创建。但不论是辅助线程还是用户界面线程,都需要指定额外的参数以修改优先级,堆栈大小,创建标志和安全特性等。函数AfxBeginThread 返回指向CWinThread 类对象的指针。创建助手线程相对简单,并不必须从CWinThread 派生一个类。实现起来需要两步:实现控制函数和启动线程。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:用VisualC 打造IE浏览器

下一篇:VisualC 编程中的文件操作

热门词条
热门标签