2024年4月2日发(作者:)

用MFC实现多线程

当使分开的任务并发执行能够带来性能的提升时,你可以在你的应用程序中使用多线

程。例如:考虑一个文字处理软件,它每5分钟备份一次当前的文档。用户经应用程序主

窗口到文档的输入由主线程处理。应用程序代码可以创建一个分开的线程来负责安排和执

行自动备份。建立一个辅线程可以防止对较长文档的备份工作影响用户界面的响应能力。

使用多线程可以为你的应用程序带来性能上的增益的情况包括:

■ 排班(时间驱动)的活动 文字处理软件例子中执行自动备份特性的线程在5分钟

间隔内被阻塞。在Win32应用程序中,线程排班可以被设置到毫秒精度。

■ 事件驱动的活动 线程可以被来自其它线程的信号触发。举一个监视系统的例子:

记录错误的线程通常处于非活动状态,直到其它线程通知它某种错误发生时才活动。

■ 分布式的活动 当数据必须从多个计算机收集(或派发给多个计算机)时,倾向于

为每个请求创建一个线程以便它们可以并行处理,且处于它们自己的时间框架内。

■ 区分优先次序的活动 Win32线程可以被赋予一个优先级来决定由线程排班程序

分配给它的运行时间的比例。有时,为了提高程序的响应能力,将它所要做的工作分为一

个高优先级的线程来处理用户界面和一个低优先级的线程来处理后台工作将会很有用。

MFC的多线程:CWinThread类

在MFC中所有的线程都由CWinThread对象来表现,包括你的应用程序的主线程。

主线程由一个起源于CWinApp的类实现,而CWinApp直接起源于CWinThread。

虽然Win32 API提供了_beginthreadex函数,可以让你在底层启动线程,但是,你

应该总是使用CWinThread类来创建那些需要使用MFC功能的线程。这是因为

CWinThread类使用线程本地存储来管理在MFC环境中的线程的上下文信息。你可以直

接声明CWinThread对象,但在许多情况下,你将让MFC全局函数AfxBeginThread()

来为你创建一个CWinThread对象。

CWinThread::CreateThread()函数用来启动新的线程。CWinThread类也提供了

SuspendThread()和ResumeThread()函数以便你挂起和恢复线程的执行。

工作线程和用户界面线程

MFC区别两种线程:工作线程和用户界面线程。这种区分是由MFC自己进行的,

Win32 API不区分线程的种类。

工作线程一般用来完成那些不需要用户输入的后台任务。可举的例子包括数据库备份

功能和网络联接状态监视功能。

用户界面线程能够处理用户输入,它们通过实现消息循环来响应那些由用户与应用程

序交互所产生的事件和消息。用户界面线程的最好的例子是你的应用程序中由源自

CWinApp的类所表现的主线程。辅助的用户界面线程可以提供一种方法,使得与应用程

序的交互不会降低其它应用特性的性能。例如,考虑一个可以让麻醉师监视手术中的病人

情况的应用程序。一个用户界面线程可以使麻醉师进入他管理的麻药的细节,而不至于打

断用于监视病人生命状况的线程。