C++课件第16章多任务与多线程编程.ppt
文本预览下载声明
第16章 多任务与多线程编程;本章主要教学内容;第16章 多任务与多线程编程;16.1 程序、进程和线程概述;;;16.1.1 多任务、进程和线程; 一个进程可以有一个或多个线程,其中一个是主线程。;16.2 线程的种类;16.16.1 MFC中的线程类;16.16.1 MFC中的线程类;16.16.2 用户界面线程(UI);16.16.3 工作者线程;16.3 线程的创建、启动和终止;一、AfxBeginThread函数用来创建工作者线程的调用格式:;;;;16.函数返回值的说明:;;;CWinThread* pWinThread;
pWinThread=AfxBeginThread(
ControlFunction,
pParam,
THREAD_PRIORTY_NORMAL,
0,
CREATE_SUSPENDED,
NULL);;;;;;;16.3.3 线程的终止;16.3.3 线程的终止;16.3.3 线程的终止;VOID WINAPI ExitProcess( UINT uExitCode ); ;16.4.1 线程的运行状态的设置;16.4.1 线程的运行状态的设置;16.4.2 线程的优先级;16.4.2 线程的优先级;16.4.2 线程的优先级;16.4.2 线程的优先级;16.4.2 线程的优先级;16.4.2 线程的优先级;16.4.2 线程的优先级;16.4.3 线程间的通信;16.4.3 线程间的通信;16.4.3 线程间的通信;16.4.3 线程间的通信;16.4.3 线程间的通信;三、使用同步类来实现线程之间的通信和控制
在16.5小节中将详细介绍;16.5 在VC++环境中使用同步对象;16.5 在VC++环境中使用同步对象;16.5 在VC++环境中使用同步对象;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象; 补充说明:在MFC中,CEvent类对象有两种类型,分别是所谓的手工事件和自动事件。对于自动事件,当其获得信号后,就会释放下一个可用的线程。一个自动 CEvent对象在被至少一个线程释放后会自动返回到无信号状态;而人工事件对象获得信号后,释放所有可利用线程,直到调用成员函数ReSetEvent()将其设置为无信号状态时为止。
注意:在创建CEvent类的对象时,默认创建的是自动事件。 ;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象;16.5.1 事件对象;6. WaitForSingleObject( ):
其原型声明如下:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
); 当在线程的执行函数中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果经过dwMilliseconds毫秒后,hHandle指向的对象变为有信号状态,则WaitForSingleObject()返回,线程被释放,且返回值为WAIT_TIMEOUT;如果在挂起的dwMilliseconds毫秒内,线程所等待的对象在某一时刻变为有信号,则该函数立即返回,返回值为WAIT_OBJECT_0。; 参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。; CEvent::ResetEvent( )把对象设置为无信号状态,程序在WaitForSingleObject(hHandle,INFINITE)处等待。
CEvent::SetEvent( )把对象设置为有信号状态,释放等待的线程。
如果CEvent对象为自动事件,则当WaitForSingleObject(hHandle,INFINITE)返回时,自动把CEvent对象重置为无信号状态。; B线程在执行到CEvent类成员函数Lock( )时将会发生阻塞,而A线程此时则可以在没有B线程干扰的情况下对共享资源进行处理,并在处理完成后通过成员函数SetEvent( )向B发出事件,使其被释放,得以对A先前已处理完毕的共享资源进行操作。 ;16.5.2 临界区;16.5.2 临界区;16.5.2 临界区;1
显示全部