欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第10章 多线程编程.ppt

    • 资源ID:87328402       资源大小:485KB        全文页数:46页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第10章 多线程编程.ppt

    第第 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章章 多线程编程多线程编程 大大多多数数操操作作系系统统,可可以以同同时时运运行行几几个个程程序序,操操作作系系统的这种能力称之为多任务处理统的这种能力称之为多任务处理。WindowsWindows操操作作系系统统用用多多进进程程/线线程程机机制制提提供供对对一一个个应应用用程程序序内内多多任任务务的的支支持持,进进程程与与线线程程之之间间是是密密不不可可分分的的,线程依附于进程,一个进程可包含多个线程。线程依附于进程,一个进程可包含多个线程。2Visual C+程序设计与应用教程08-Apr-2310.1.1 问题的提出问题的提出【例例10.1】创创建建一一个个基基于于对对话话框框的的应应用用程程序序Li10_1,其其界界面面如如图图下下图图所所示示。按按下下“开开始始打打印印”按按钮钮后后,模模拟拟启启动动一一个耗时的打印程序。个耗时的打印程序。第第1010章章 多线程编程多线程编程 3Visual C+程序设计与应用教程08-Apr-2310.1.2 进程和线程进程和线程 进进程程是是应应用用程程序序的的执执行行实实例例,是是操操作作系系统统分分配配资源单位。资源单位。每每个个进进程程是是由由私私有有的的虚虚拟拟地地址址空空间间、代代码码、数数据据和和其其它它各各种种系系统统资资源源组组成成,进进程程在在运运行行过过程程中中创创建建的的资资源源随随着着进进程程的的终终止止而而被被销销毁毁,所所使使用用的的系系统统资资源源在进程终止时被释放或关闭。在进程终止时被释放或关闭。线线程程是是操操作作系系统统分分配配处处理理器器的的最最基基本本单单元元,它它是进程内部的一个独立的执行单元。是进程内部的一个独立的执行单元。第第1010章章 多线程编程多线程编程 4Visual C+程序设计与应用教程08-Apr-23 可可以以用用VC+所所带带的的工工具具Spy+来来观观察察操操作作系系统统管理的进程和线程。管理的进程和线程。打打开开Word应应用用程程序序和和Windows附附件件中中的的“记记事本事本”,这样系统内部就产生了两个进程。,这样系统内部就产生了两个进程。选选择择【Tools|Spy+】菜菜单单命命令令,打打开开如如下下图图所示的所示的Spy+应用程序窗口。应用程序窗口。第第1010章章 多线程编程多线程编程 5Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 6Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 选选择择【Spy|Processes】菜菜单单命命令令,在在打打开开的的窗窗口口中中可可以以看看到到操操作作系系统统管管理理的的所所有有进进程程的的信信息息,如如下图所示。下图所示。7Visual C+程序设计与应用教程08-Apr-2310.1.3 MFC对多线程编程的支持对多线程编程的支持 多多线线程程的的操操作作由由MFC类类CWinThread及及其其派派生生类支持,该类的对象代表进程中执行的线程。类支持,该类的对象代表进程中执行的线程。下下图图给给出出了了MFC应应用用程程序序框框架架结结构构类类的的继继承承关关系。系。第第1010章章 多线程编程多线程编程 8Visual C+程序设计与应用教程08-Apr-23 从从上上图图可可以以看看出出,MFC应应用用程程序序类类CWinApp是是由由CWinThread类派生而来的,用于启动进程的主线程。类派生而来的,用于启动进程的主线程。另另外外,MFC还还提提供供了了支支持持多多线线程程同同步步的的同同步步类类,如如CEvent、CCriticalSection、CSemaphore和和 CMutex等等。也也提提供供了了线线程程同同步步辅辅助助类类CSingleLock和和CMutiLock。第第1010章章 多线程编程多线程编程 9Visual C+程序设计与应用教程08-Apr-2310.2 线程的创建线程的创建第第1010章章 多线程编程多线程编程 MFCMFC中中有有两两类类线线程程,分分别别称称之之为为工工作作者者线线程程和和用用户户界界面线程。面线程。两两者者的的主主要要区区别别在在于于:工工作作者者线线程程没没有有消消息息循循环环,而用户界面线程有自己的消息队列和消息循环。而用户界面线程有自己的消息队列和消息循环。10Visual C+程序设计与应用教程08-Apr-2310.2.1 创建工作者线程创建工作者线程 创创建建一一个个工工作作者者线线程程,首首先先需需要要编编写写一一个个希希望望与与应应用用程程序序的的其其余余部部分分并并行行运运行行的的自自定定义义函函数数,该该函函数数称称为为线线程程函函数数。然然后后,在在程程序序中中合合适适的的地地方方调调用用全全局局函函数数AfxBeginThread()创建线程,启动线程函数。创建线程,启动线程函数。第第1010章章 多线程编程多线程编程 11Visual C+程序设计与应用教程08-Apr-231.定义线程函数定义线程函数线程函数的固定形式:线程函数的固定形式:UINT FunctionName(LPVOID pParam)FunctionName是是用用户户自自定定义义的的函函数数名名,LPVOID表表示示指指向向空空类类型型的的指指针针,相相当当于于void*,必必要要时时需需要要把把这这个个指指针针转转换换成成所所需需要要的的类类型型。函函数数的的返返回回值值将将作作为为线线程程的的结结束束码码,线线程程函函数数结结束束后后线线程程就就自自动动终终止止。函函数数的的返返回回值值如如果果为为0,表示线程函数正常结束。表示线程函数正常结束。第第1010章章 多线程编程多线程编程 12Visual C+程序设计与应用教程08-Apr-232启动线程函数启动线程函数CWinThread*AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);pfnThreadProc是是 一一 个个 指指 向向 线线 程程 函函 数数 的的 指指 针针,参参 数数pParam的的类类型型与与线线程程函函数数的的参参数数类类型型完完全全一一致致,该该参参数数为为启启动动线线程程时时传传递递给给线线程程函函数数的的入入口口参参数数。其其他他几几个个参参数数用用于于设设置置线线程程优优先先级级、线线程程的的堆堆栈栈大大小小、创创建建时时是是否否立立即即运行及线程的安全属性,这运行及线程的安全属性,这4个参数通常使用默认值。个参数通常使用默认值。第第1010章章 多线程编程多线程编程 13Visual C+程序设计与应用教程08-Apr-23【例例10.2】编编写写一一个个创创建建工工作作线线程程的的单单文文档档应应用用程程序序Li10_2,当当执执行行【计计算算素素数数】菜菜单单命命令令时时启启动动一一个个工工作作线线程,计算程,计算11000000之间素数的个数。之间素数的个数。第第1010章章 多线程编程多线程编程 14Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 10.2.2 创建用户界面线程创建用户界面线程 用用户户界界面面线线程程通通常常用用来来处处理理用用户户输输入入并并响响应应各各种种事事件件和和消消息息,它它是是通通过过自自己己的的消消息息泵泵获获取取从从系系统统接接收收到到的的消消息息。MFC将将为为该该线线程程增增加加一一个个消消息息循循环环,以以便便能能够够处处理理收收到到的的消息。消息。创创建建用用户户界界面面线线程程的的过过程程与与创创建建一一个个工工作作者者线线程程的的过过程程完完全全不不同同。一一个个工工作作者者线线程程用用由由一一个个线线程程函函数数代代表表,但但一一个个用用户户界界面面线线程程的的行行为为由由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 pSecurityAttrs=NULL);pThreadClass指指向向一一个个CRuntimeClass对对象象,该该对对象象是是用用RUNTIME_CLASS宏宏从从CWinThread的的派派生生类类创创建建的。其他参数的含义与前述的函数的。其他参数的含义与前述的函数AfxBeginThread()一样一样。16Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 在程序中创建一个用户界面线程:在程序中创建一个用户界面线程:AfxBeginThread(RUNTIME_CLASS(class_name);实参实参class_name是是CWinThread的派生类的名字。的派生类的名字。17Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.3】在在基基于于对对话话框框的的应应用用程程序序Li10_3中中创创建建用用户户界界面面线线程程。每每单单击击一一次次“用用户户界界面面线线程程”按按钮钮,都都会会弹弹出出一一个个线线程程对对话话框框,在在任任何何一一个个线线程程对对话话框框内内按按下下鼠鼠标标左左键键,都会弹出一个消息框,效果如下图所示。都会弹出一个消息框,效果如下图所示。18Visual C+程序设计与应用教程08-Apr-2310.3 线程的控制线程的控制第第1010章章 多线程编程多线程编程 线程控制是指控制线程的状态线程控制是指控制线程的状态。从以下几个方面控制线程从以下几个方面控制线程:创创建建一一个个线线程程、终终止止一一个个线线程程、挂挂起起一一个个正正运运行行的的线线程程、激激活活一一个个暂暂停停运运行行的的线线程程、读读取取和和设设置置线线程程的的优优先先级级、使使当当前前线线程程等等待待一一定定的的时时间间及及放放弃弃一一个个或或多多个个运运行时间片等行时间片等。19Visual C+程序设计与应用教程08-Apr-2310.3.1 终止一个线程终止一个线程第第1010章章 多线程编程多线程编程 当当一一个个工工作作者者线线程程的的线线程程函函数数执执行行一一个个返返回回语语句句或或者者调调用用AfxEndThread()成成员员函函数数时时,这这个个工工作作者者线程就终止。线程就终止。AfxEndThread()函数原型:函数原型:void AfxEndThread(UNIT nExitCode);参数参数nExitCode表示线程的表示线程的32位退出码。位退出码。20Visual C+程序设计与应用教程08-Apr-2310.3.2 悬挂和恢复线程悬挂和恢复线程第第1010章章 多线程编程多线程编程 CWinThread类中包含线程悬挂和恢复的成员函数。类中包含线程悬挂和恢复的成员函数。悬挂就是挂起或暂定线程的运行。悬挂函数:悬挂就是挂起或暂定线程的运行。悬挂函数:DWORD CWinThread:SuspendThread();恢恢复复就就是是激激活活一一个个暂暂停停运运行行的的线线程程,即即被被悬悬挂挂的的线线程程。恢复函数:恢复函数:DWORD CWinThread:ResumeThread();21Visual C+程序设计与应用教程08-Apr-2310.3.3 线程的优先级线程的优先级第第1010章章 多线程编程多线程编程 使使用用CWinThread:SetThreadPriority函函数数设设置置线线程程的相对优先级的相对优先级:使使用用CWinThread:GetThreadPriority函函数数获获取取线线程的相对优先级程的相对优先级:int GetThreadPriority(HANDLE hThread);参参数数hThread是是要要设设置置或或获获取取优优先先级级线线程程的的句句柄柄,参参数数nPriority就是要设置的优先级就是要设置的优先级。BOOL SetThreadPriority(HANDLE hThread,int nPriority);22Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.4】在在基基于于对对话话框框的的应应用用程程序序Li10_4中中,首首先先创创建建两两个个工工作作线线程程,分分别别控控制制滑滑动动条条及及进进度度条条的的走走动动,然然后后对对线线程程进进行行控控制制,包包括括挂挂起起、唤唤醒醒、停停止止及及优优先先级级的的设设置置。程序运行界面如程序运行界面如下图下图所示所示。23Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 10.4 线程间的通信线程间的通信 一一般般可可以以使使用用全全局局变变量量进进行行通通信信和和自自定定义义消消息息进进行行通通信信。10.4.1 使用全局变量进行通信使用全局变量进行通信 对对于于标标准准类类型型的的全全局局变变量量,建建议议使使用用volatile 修修饰饰符符,它它告告诉诉编编译译器器无无需需对对该该变变量量作作任任何何的的优优化化,即即无无需需将将它它放放到到一一个个寄寄存存器器中中,并并且且该该值值可可被被外外部部改改变变。如如果果线线程程间间所所需需传传递递的的信信息息较较复复杂杂,可可以以定定义义一一个个结结构构,通通过过传传递递指指向向该该结结构构的的指指针针进进行行传传递递信信息息。接接着着让让线线程程监监视视这这个个变变量量,当当这这个个变变量量符符合合一一定定的的条条件件时时,表表示示线线程程应该终止应该终止。24Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 10.4.2 使用自定义消息进行通信使用自定义消息进行通信 使使用用Windows消消息息来来进进行行通通讯讯,首首先先需需要要定定义义一一个个自自定定义义消消息息,然然后后,需需要要时时在在一一个个线线程程中中调调用用全全局局函函数数:PostMessage()向向 另另 一一 个个 线线 程程 发发 送送 自自 定定 义义 消消 息息。PostMessage()函数的原型为函数的原型为:BOOL PostMessage(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam);hwnd为为发发送送窗窗口口的的句句柄柄,Msg为为消消息息的的ID,wParam和和lParam为消息的相关参数为消息的相关参数。25Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.5】完完善善例例10.2中中的的 Li10_2,Calculateprime()线线程程函函数数执执行行完完后后,向向主主线线程程发发送送消消息息,主主线线程程收收到到该该消息后再显示计算结果。消息后再显示计算结果。26Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 使使隶隶属属于于同同一一进进程程的的各各线线程程协协调调一一致致地地工工作作称称为为线线程的同步程的同步。在在多多线线程程的的环环境境里里,需需要要对对线线程程进进行行同同步步。常常用用的的同步对象有临界区、互斥、信号量和事件同步对象有临界区、互斥、信号量和事件。10.5 线程间的同步线程间的同步27Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 当当多多个个线线程程访访问问临临界界区区时时,可可以以使使用用临临界界区区对对象象,即即CCriticalSection类类的的对对象象。临临界界区区是是一一个个独独占占性性共共享享资源,任一时刻只有一个线程可以拥有临界区资源,任一时刻只有一个线程可以拥有临界区。10.5.1 使用使用CCriticalSection类类28Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 CCriticalSection类的用法有两种类的用法有两种:u方法一:单独使用方法一:单独使用CCriticalSection对象对象步骤如下步骤如下:(1)定定义义CCriticalSection类类的的一一个个全全局局对对象象(以以使使各各个个线线程均能访问程均能访问),如,如:CCriticalSection critical_section;CCriticalSection类类的的构构造造函函数数只只有有一一种种形形式式,即即不不带带任任何参数,如上述代码所示何参数,如上述代码所示。29Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 (2)在在访访问问临临界界区区之之前前,调调用用CCriticalSection类类的的成成员员Lock()获得临界区。获得临界区。critical_section.Lock();其中其中Lock()的原型的原型:BOOL Lock();在在线线程程中中调调用用该该函函数数来来使使线线程程获获得得它它所所请请求求的的临临界界区区。如如果果此此时时没没有有其其他他线线程程占占有有临临界界区区,则则调调用用Lock()的的线线程程获获得得临临界界区区;否否则则,线线程程即即将将挂挂起起,并并放放入入到到一一个个系系统统队队列列中中等等待待,直直到到当当前前拥拥有有临临界界区区的的线线程程释释放放了了临界区时为止临界区时为止。30Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 (3)在本线程中访问临界区中的共享资源在本线程中访问临界区中的共享资源。(4)访访问问临临界界区区完完毕毕后后,使使用用CCriticalSection的的成成员员函函数数UnLock()来释放临界区。来释放临界区。critical_section.UnLock();31Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 u方方法法二二:与与同同步步辅辅助助类类CSingleLock或或CMutiLock类类一起使用,步骤如下一起使用,步骤如下(以类以类CSingleLock为例为例):(1)定义定义CCriticalSection类的一个全局对象类的一个全局对象critical_section:CCriticalSection critical_section;(2)在在访访问问临临界界区区之之前前,定定义义CSingleLock类类的的一一个个对对象象,并将并将critical_section的地址传送给构造函数,如:的地址传送给构造函数,如:CSingleLock singlelock(&critical_section);32Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 (3)使用使用CSingleLock类的成员函数类的成员函数Lock()请求获得临界区。请求获得临界区。singlelock.Lock();其中,其中,CSingleLock类的成员函数类的成员函数Lock()原型原型:BOOL Lock(DWORD dwTimeOut=INFINITE);该该函函数数替替它它所所在在的的线线程程申申请请获获得得临临界界区区。如如果果临临界界区区已已经经被被其其他他线线程程占占用用,则则本本线线程程挂挂起起,等等待待临临界界区区被被释释放放。获获得得临临界界区区(返返回回TRUE)或或等等待待时时间间超超过过dwTimeOut()毫毫秒秒(返回返回FALSE)后均返回后均返回。33Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 (4)在本线程中访问临界区中的共享资源在本线程中访问临界区中的共享资源。(5)调调用用CSingleLock类类的的成成员员函函数数UnLock()来来释释放放临界区。临界区。singlelock.UnLock();34Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.6】建建立立一一个个基基于于对对话话框框的的应应用用程程序序Li10_6,该该应应用用程程序序中中包包含含两两个个线线程程。一一个个线线程程向向数数组组中中写写“A”,另另 一一 个个 线线 程程 向向 数数 组组 中中 写写“B”,使使 用用CCriticalSection类类保保证证在在同同一一时时刻刻只只有有一一个个线线程程能能访访问问共共享享对对象象数数组组。程程序序运运行行时时,出出现现如如下下图图所所示示应应用程序界面。用程序界面。35Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 互互斥斥对对象象与与临临界界区区对对象象相相似似。互互斥斥对对象象源源于于“mutual exclusion”的组合的组合。临临界界区区对对象象与与互互斥斥对对象象的的不不同同在在于于:互互斥斥对对象象可可以以在在进进程程间间使使用用,而而临临界界区区对对象象只只能能在在同同一一进进程程的的各各线线程程间使用间使用。CMutex类类的的使使用用类类似似于于CCriticalSection的的用用法法,下下面面使使用用类类似似于于CCriticalSection用用法法中中的的第第二二种种用用法法进进行演示说明行演示说明。10.5.2 使用使用CMutex类类36Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.7】修修改改例例10.6中中的的应应用用程程序序Li10_6,使使用用CMutex类保证在同一时刻只有一个线程能访问共享数据。类保证在同一时刻只有一个线程能访问共享数据。37Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 10.5.3 使用使用CSemaphore类类 当当需需要要一一个个计计数数器器来来限限制制可可以以使使用用某某个个资资源源的的线线程程数数目目时时,可可以以使使用用信信号号量量对对象象,即即CSemaphore类类的的对对象象。CSemaphore的的一一个个对对象象保保存存了了对对当当前前访访问问某某一一指指定定资资源源的的线线程程的的计计数数值值,该该计计数数值值是是当当前前还还可可以以使使用用该该资源的线程的数目资源的线程的数目。38Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 CSemaphore类的构造函数原型:类的构造函数原型:CSemaphore(LONG lInitialCount=1,LONG lMaxCount=1,LPCTSTR pstrName=NULL,LPSECURITY_ATTRIBUTES lpsaAttributes=NULL);参参数数lInitialCount为为信信号号量量对对象象的的初初始始计计数数值值,即即可可访访问问线线程程数数目目的的初初始始值值;参参数数lMaxCount为为信信号号量量对对象象计计数数值值的的最最大大值值,该该参参数数决决定定了了同同一一时时刻刻可可访访问问由由信信号号量量保保护护的的资资源源的的线线程程最最大大数数目目;后后两两个个参参数数在在同同一一进进程程中中使使用用一一般般为为NULL。39Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.8】建建立立一一个个基基于于对对话话框框的的应应用用程程序序Li10_8,该该应应用用程程序序中中包包含含3个个线线程程。一一个个线线程程向向数数组组中中写写“A”,第第二二个个线线程程向向数数组组中中写写“B”,第第三三个个线线程程向向数数组组中中写写“C”,使使用用CSemaphore类类保保证证在在同同一一时时刻刻最最多多只只能能有有两两个个线线程程能能访访问问共共享享对对象象数数组组。程程序序运运行行时时,出出现现如如下下图图所所示示应应用程序界面用程序界面。40Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 10.5.4 使用使用CEvent 类类 CEvent类类提提供供了了对对事事件件的的支支持持。事事件件是是一一个个允允许许一一个个线线程程在在某某种种情情况况发发生生时时,唤唤醒醒另另外外一一个个线线程程的的同同步步对对象象。事事件件告告诉诉线线程程何何时时去去执执行行某某一一给给定定的的任任务务,从从而而使使多个线程流平滑。多个线程流平滑。41Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 在在MFC中中,CEvent类类对对象象有有两两种种类类型型:人人工工事事件件和自动事件和自动事件。一一个个自自动动的的CEvent对对象象在在被被至至少少一一个个线线程程释释放放后后会会自自动动返返回回到到无无信信号号状状态态;而而人人工工的的CEvent对对象象获获得得信信号号后后,释释放放可可利利用用线线程程,但但直直到到调调用用成成员员函函数数ReSetEvent()才才将将其其设设置置为为无无信信号号状状态态。在在创创建建CEvent类类的的对对象象时时,默认创建的是自动事件默认创建的是自动事件。42Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 1CEvent类的构造函数类的构造函数CEvent类的构造函数类的构造函数:CEvent(BOOL bInitiallyOwn=FALSE,BOOL bManualReset=FALSE,LPCTSTR lpszName=NULL,LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);参参数数bInitiallyOwn指指定定事事件件对对象象初初始始化化状状态态,TRUE为为有有信信号号,FALSE为为无无信信号号;参参数数bManualReset指指定定要要创创建建的的事事件件是是属属于于人人工工事事件件还还是是自自动动事事件件,TRUE为为人人工工事事件件,FALSE为为自自动动事事件件;后后两两个个参参数数分分别别表表示示CEvent对象的名称和安全属性,一般设为对象的名称和安全属性,一般设为NULL。43Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 2改变改变CEvent对象状态的函数对象状态的函数(1)SetEvent()函数函数 该该函函数数将将CEvent类类对对象象的的状状态态设设置置为为有有信信号号状状态态,并且释放所有等待的线程。原型为并且释放所有等待的线程。原型为:BOOL SetEvent();如果该函数执行成功,则返回非零值,否则返回零如果该函数执行成功,则返回非零值,否则返回零。44Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 (2)ResetEvent()函数函数该该函函数数将将事事件件的的状状态态设设置置为为无无信信号号状状态态,并并保保持持该该状状态态直直至至SetEvent()被被调调用用时时为为止止,由由于于自自动动事事件件是是由由系系统统自自动动重重置置,故故自自动动事事件件不不需需要要调调用用该该函函数数。该该函函数数的的原原型为:型为:BOOL ResetEvent();如果该函数执行成功,返回非零值,否则返回零。如果该函数执行成功,返回非零值,否则返回零。45Visual C+程序设计与应用教程08-Apr-23第第1010章章 多线程编程多线程编程 【例例10.9】完完善善例例10.2中中的的 Li10_2,通通过过CEvent类类对对象象解决例解决例10.2存在的缺陷。存在的缺陷。46

    注意事项

    本文(第10章 多线程编程.ppt)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开