第10章 多线程编程.ppt
《第10章 多线程编程.ppt》由会员分享,可在线阅读,更多相关《第10章 多线程编程.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 10 10 章章 多线程编程多线程编程Visual C+Visual C+Visual C+Visual C+程序设计与应用教程程序设计与应用教程程序设计与应用教程程序设计与应用教程10.1 概述概述10.2 线程的创建线程的创建10.3 线程的控制线程的控制10.4 线程间的通信线程间的通信10.5 线程间的同步线程间的同步1Visual C+程序设计与应用教程08-Apr-2310.1 概述概述 第第1010章章 多线程编程多线程编程 大大多多数数操操作作系系统统,可可以以同同时时运运行行几几个个程程序序,操操作作系系统的这种能力称之为多任务处理统的这种能力称之为多任务处理。Wind
2、owsWindows操操作作系系统统用用多多进进程程/线线程程机机制制提提供供对对一一个个应应用用程程序序内内多多任任务务的的支支持持,进进程程与与线线程程之之间间是是密密不不可可分分的的,线程依附于进程,一个进程可包含多个线程。线程依附于进程,一个进程可包含多个线程。2Visual C+程序设计与应用教程08-Apr-2310.1.1 问题的提出问题的提出【例例10.1】创创建建一一个个基基于于对对话话框框的的应应用用程程序序Li10_1,其其界界面面如如图图下下图图所所示示。按按下下“开开始始打打印印”按按钮钮后后,模模拟拟启启动动一一个耗时的打印程序。个耗时的打印程序。第第1010章章
3、多线程编程多线程编程 3Visual C+程序设计与应用教程08-Apr-2310.1.2 进程和线程进程和线程 进进程程是是应应用用程程序序的的执执行行实实例例,是是操操作作系系统统分分配配资源单位。资源单位。每每个个进进程程是是由由私私有有的的虚虚拟拟地地址址空空间间、代代码码、数数据据和和其其它它各各种种系系统统资资源源组组成成,进进程程在在运运行行过过程程中中创创建建的的资资源源随随着着进进程程的的终终止止而而被被销销毁毁,所所使使用用的的系系统统资资源源在进程终止时被释放或关闭。在进程终止时被释放或关闭。线线程程是是操操作作系系统统分分配配处处理理器器的的最最基基本本单单元元,它它是
4、进程内部的一个独立的执行单元。是进程内部的一个独立的执行单元。第第1010章章 多线程编程多线程编程 4Visual C+程序设计与应用教程08-Apr-23 可可以以用用VC+所所带带的的工工具具Spy+来来观观察察操操作作系系统统管理的进程和线程。管理的进程和线程。打打开开Word应应用用程程序序和和Windows附附件件中中的的“记记事本事本”,这样系统内部就产生了两个进程。,这样系统内部就产生了两个进程。选选择择【Tools|Spy+】菜菜单单命命令令,打打开开如如下下图图所示的所示的Spy+应用程序窗口。应用程序窗口。第第1010章章 多线程编程多线程编程 5Visual C+程序设
5、计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 6Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 选选择择【Spy|Processes】菜菜单单命命令令,在在打打开开的的窗窗口口中中可可以以看看到到操操作作系系统统管管理理的的所所有有进进程程的的信信息息,如如下图所示。下图所示。7Visual C+程序设计与应用教程08-Apr-2310.1.3 MFC对多线程编程的支持对多线程编程的支持 多多线线程程的的操操作作由由MFC类类CWinThread及及其其派派生生类支持,该类的对象代表进程中执行的线程。类支持,该类的对象代表进
6、程中执行的线程。下下图图给给出出了了MFC应应用用程程序序框框架架结结构构类类的的继继承承关关系。系。第第1010章章 多线程编程多线程编程 8Visual C+程序设计与应用教程08-Apr-23 从从上上图图可可以以看看出出,MFC应应用用程程序序类类CWinApp是是由由CWinThread类派生而来的,用于启动进程的主线程。类派生而来的,用于启动进程的主线程。另另外外,MFC还还提提供供了了支支持持多多线线程程同同步步的的同同步步类类,如如CEvent、CCriticalSection、CSemaphore和和 CMutex等等。也也提提供供了了线线程程同同步步辅辅助助类类CSingl
7、eLock和和CMutiLock。第第1010章章 多线程编程多线程编程 9Visual C+程序设计与应用教程08-Apr-2310.2 线程的创建线程的创建第第1010章章 多线程编程多线程编程 MFCMFC中中有有两两类类线线程程,分分别别称称之之为为工工作作者者线线程程和和用用户户界界面线程。面线程。两两者者的的主主要要区区别别在在于于:工工作作者者线线程程没没有有消消息息循循环环,而用户界面线程有自己的消息队列和消息循环。而用户界面线程有自己的消息队列和消息循环。10Visual C+程序设计与应用教程08-Apr-2310.2.1 创建工作者线程创建工作者线程 创创建建一一个个工工
8、作作者者线线程程,首首先先需需要要编编写写一一个个希希望望与与应应用用程程序序的的其其余余部部分分并并行行运运行行的的自自定定义义函函数数,该该函函数数称称为为线线程程函函数数。然然后后,在在程程序序中中合合适适的的地地方方调调用用全全局局函函数数AfxBeginThread()创建线程,启动线程函数。创建线程,启动线程函数。第第1010章章 多线程编程多线程编程 11Visual C+程序设计与应用教程08-Apr-231.定义线程函数定义线程函数线程函数的固定形式:线程函数的固定形式:UINT FunctionName(LPVOID pParam)FunctionName是是用用户户自自定
9、定义义的的函函数数名名,LPVOID表表示示指指向向空空类类型型的的指指针针,相相当当于于void*,必必要要时时需需要要把把这这个个指指针针转转换换成成所所需需要要的的类类型型。函函数数的的返返回回值值将将作作为为线线程程的的结结束束码码,线线程程函函数数结结束束后后线线程程就就自自动动终终止止。函函数数的的返返回回值值如如果果为为0,表示线程函数正常结束。表示线程函数正常结束。第第1010章章 多线程编程多线程编程 12Visual C+程序设计与应用教程08-Apr-232启动线程函数启动线程函数CWinThread*AfxBeginThread(AFX_THREADPROC pfnTh
10、readProc,LPVOID pParam,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);pfnThreadProc是是 一一 个个 指指 向向 线线 程程 函函 数数 的的 指指 针针,参参 数数pParam的的类类型型与与线线程程函函数数的的参参数数类类型型完完全全一一致致,该该参参数数为为启启动动线线程程时时传传递递给给线线程程函函数数的的入入口口参参数数。其其他他几几个个参参数数用用于于设设
11、置置线线程程优优先先级级、线线程程的的堆堆栈栈大大小小、创创建建时时是是否否立立即即运行及线程的安全属性,这运行及线程的安全属性,这4个参数通常使用默认值。个参数通常使用默认值。第第1010章章 多线程编程多线程编程 13Visual C+程序设计与应用教程08-Apr-23【例例10.2】编编写写一一个个创创建建工工作作线线程程的的单单文文档档应应用用程程序序Li10_2,当当执执行行【计计算算素素数数】菜菜单单命命令令时时启启动动一一个个工工作作线线程,计算程,计算11000000之间素数的个数。之间素数的个数。第第1010章章 多线程编程多线程编程 14Visual C+程序设计与应用教
12、程08-Apr-23第第1010章章 多线程编程多线程编程 10.2.2 创建用户界面线程创建用户界面线程 用用户户界界面面线线程程通通常常用用来来处处理理用用户户输输入入并并响响应应各各种种事事件件和和消消息息,它它是是通通过过自自己己的的消消息息泵泵获获取取从从系系统统接接收收到到的的消消息息。MFC将将为为该该线线程程增增加加一一个个消消息息循循环环,以以便便能能够够处处理理收收到到的的消息。消息。创创建建用用户户界界面面线线程程的的过过程程与与创创建建一一个个工工作作者者线线程程的的过过程程完完全全不不同同。一一个个工工作作者者线线程程用用由由一一个个线线程程函函数数代代表表,但但一一
13、个个用用户户界界面面线线程程的的行行为为由由CWinThread类类的的派派生生类类来来控控制制。15Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 创建用户界面线程的创建用户界面线程的AfxBeginThread()函数函数:CWinThread*AfxBeginThread(CRuntimeClass*pThreadClass,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES pSecurityAt
14、trs=NULL);pThreadClass指指向向一一个个CRuntimeClass对对象象,该该对对象象是是用用RUNTIME_CLASS宏宏从从CWinThread的的派派生生类类创创建建的。其他参数的含义与前述的函数的。其他参数的含义与前述的函数AfxBeginThread()一样一样。16Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 在程序中创建一个用户界面线程:在程序中创建一个用户界面线程:AfxBeginThread(RUNTIME_CLASS(class_name);实参实参class_name是是CWinThread的派生类的名
15、字。的派生类的名字。17Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.3】在在基基于于对对话话框框的的应应用用程程序序Li10_3中中创创建建用用户户界界面面线线程程。每每单单击击一一次次“用用户户界界面面线线程程”按按钮钮,都都会会弹弹出出一一个个线线程程对对话话框框,在在任任何何一一个个线线程程对对话话框框内内按按下下鼠鼠标标左左键键,都会弹出一个消息框,效果如下图所示。都会弹出一个消息框,效果如下图所示。18Visual C+程序设计与应用教程08-Apr-2310.3 线程的控制线程的控制第第1010章章 多线程编程多线程编程
16、 线程控制是指控制线程的状态线程控制是指控制线程的状态。从以下几个方面控制线程从以下几个方面控制线程:创创建建一一个个线线程程、终终止止一一个个线线程程、挂挂起起一一个个正正运运行行的的线线程程、激激活活一一个个暂暂停停运运行行的的线线程程、读读取取和和设设置置线线程程的的优优先先级级、使使当当前前线线程程等等待待一一定定的的时时间间及及放放弃弃一一个个或或多多个个运运行时间片等行时间片等。19Visual C+程序设计与应用教程08-Apr-2310.3.1 终止一个线程终止一个线程第第1010章章 多线程编程多线程编程 当当一一个个工工作作者者线线程程的的线线程程函函数数执执行行一一个个返
17、返回回语语句句或或者者调调用用AfxEndThread()成成员员函函数数时时,这这个个工工作作者者线程就终止。线程就终止。AfxEndThread()函数原型:函数原型:void AfxEndThread(UNIT nExitCode);参数参数nExitCode表示线程的表示线程的32位退出码。位退出码。20Visual C+程序设计与应用教程08-Apr-2310.3.2 悬挂和恢复线程悬挂和恢复线程第第1010章章 多线程编程多线程编程 CWinThread类中包含线程悬挂和恢复的成员函数。类中包含线程悬挂和恢复的成员函数。悬挂就是挂起或暂定线程的运行。悬挂函数:悬挂就是挂起或暂定线程
18、的运行。悬挂函数:DWORD CWinThread:SuspendThread();恢恢复复就就是是激激活活一一个个暂暂停停运运行行的的线线程程,即即被被悬悬挂挂的的线线程程。恢复函数:恢复函数:DWORD CWinThread:ResumeThread();21Visual C+程序设计与应用教程08-Apr-2310.3.3 线程的优先级线程的优先级第第1010章章 多线程编程多线程编程 使使用用CWinThread:SetThreadPriority函函数数设设置置线线程程的相对优先级的相对优先级:使使用用CWinThread:GetThreadPriority函函数数获获取取线线程的相
19、对优先级程的相对优先级:int GetThreadPriority(HANDLE hThread);参参数数hThread是是要要设设置置或或获获取取优优先先级级线线程程的的句句柄柄,参参数数nPriority就是要设置的优先级就是要设置的优先级。BOOL SetThreadPriority(HANDLE hThread,int nPriority);22Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.4】在在基基于于对对话话框框的的应应用用程程序序Li10_4中中,首首先先创创建建两两个个工工作作线线程程,分分别别控控制制滑滑动动条条
20、及及进进度度条条的的走走动动,然然后后对对线线程程进进行行控控制制,包包括括挂挂起起、唤唤醒醒、停停止止及及优优先先级级的的设设置置。程序运行界面如程序运行界面如下图下图所示所示。23Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 10.4 线程间的通信线程间的通信 一一般般可可以以使使用用全全局局变变量量进进行行通通信信和和自自定定义义消消息息进进行行通通信信。10.4.1 使用全局变量进行通信使用全局变量进行通信 对对于于标标准准类类型型的的全全局局变变量量,建建议议使使用用volatile 修修饰饰符符,它它告告诉诉编编译译器器无无需需对对该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第10章 多线程编程 10 多线程 编程
限制150内