三种不同的线程: Windows线程、MFC工作者线程、MFC用户接口线程(User-Interface thread)
要理解这三个不同的概念,首先要理清Windows API和MFC的关系。Windows API是Windows操作系统为编程者提供的接口函数,为所有基于C/C++语言的应用程序利用系统资源和被操作系统调度提供接口。Windows API是操作系统级的通用接口,直接用其编程将会有大量重复性工作并且极易出错、不易调试。MFC为了使常用的任务,如创建窗口等变得简单、不易出错,提供了一组函数给用户,它实际是用额外的代码对Windows API函数进行了包装,引入了面向对象的概念。于是,一般说MFC是编译器级别的接口,它只适用于某公司(如Microsoft)开发的编译器。
Windows操作系统支持多线程操作,特别是基于32位寻址的WinNT内核的操作系统,如Windows2000、WindowsXP支持抢占式多任务操作,提供的应用程序接口被称为:Win32 API。如无特别说明,下面的API皆指Win32 API。
Win32 API提供了有关多线程操作的接口函数,操作系统只要知道线程函数的起始地址便可开始执行线程,没有所谓工作者线程和用户接口线程的区别,即使用MFC开启的不同线程到了操作系统级别就一视同仁了。
·MFC为什么要提出两种不同的多线程概念呢?
为了适应它的面向对象特性。前面说过MFC引入了面向对象的思想,它得以实现的关键技术之一就是消息映射(Message Map)和命令传递(Command Routing)。我们知道,推动Windows运转的是一系列的消息,“消息泵(Message Pump)”使得这些消息也具有了面向对象的特质,也就是说,归属某一类的消息只会进入该类并引发该类成员函数的调用。当用户有了输入动作的时候将会产生一个消息,这个消息进入消息循环、并“泵”到相应的类中。如果需要开启的线程有用户输入动作,它必须要有自己的“消息泵”,程序的进行根据消息推动,这就是用户接口线程(User-Interface thread);若开启的线程不需要响应用户动作,则可直接将它的任务写成简单控制函数,线程函数直接调用该控制函数,这就是工作者线程(worker thread)。
·MFC如何利用Windows API实现两种不同的线程呢?
上文说过MFC是对Windows API函数的包装,利用MFC写的程序归根到底还是要转换到Windows API函数,MFC如何将Windows线程变成不同的两种呢?
跟踪MSDN示例程序“mtdgi”的运行进入thrdcore.cpp文件,原来MFC提供给操作系统的多线程函数入口地址统一为&_AfxThreadEntry,函数_AfxThreadEntry中再根据程序员可间接修改的参数而进行分支。
2008年11月9日星期日
订阅:
博文评论 (Atom)
没有评论:
发表评论