预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

本章重难点解析HYPERLINK"http://wwww.ahtvu.ah.cn/jxc/40vc/student1/zhixin/ch8/a21.htm"\t"_self"一、程序、进程和线程HYPERLINK"http://wwww.ahtvu.ah.cn/jxc/40vc/student1/zhixin/ch8/a22.htm"\t"_self"二、在VC++环境中使用同步对象 一、程序、进程和线程 (一)进程与线程 进程是装入内存中即将执行的程序,可以包含一个或多个运行在它的上下文环境内的线程。在操作系统技术中,进程和线程的出现提高了系统的并行性,从而使应用程序更有效地利用系统资源,多线程的应用程序也就应运而生了。 在Win32(95/98/NT)中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。在许多时候,需要使用多线程,例如在与用户交互的同时进行后台计算的处理或通信。 在Win95/98/NT系统中,一个程序的崩溃一般不会造成死机,其他程序仍然可以运行,用户可以通过按Ctrl+Alt+Del键来打开任务列表并关闭没有响应的程序而不影响其他正在运行的应用程序。这是多线程的作用。 多任务是指系统可以同时运行多个进程,而每个进程也可以同时执行多个线程。一个程序可以同时运行多个线程,每个线程独立地执行程序代码中的一组语句。进程就是应用程序的实例。每个进程都有自己私有的虚拟地址空间。每个进程都有一个主线程,但可以建立另外的线程,进程中的线程是并行执行的,每个线程占用CPU的时间由系统来划分。 线程是Win95/98/NT系统调度的基本单位,系统启动时,一个进程至少有一个线程,进程可以通过调用运行库函数或Win32API函数来增加线程。线程可以看成是操作系统分配CPU时间的基本实体,系统不停地在各个线程之间进行切换。 (二)线程的种类 线程分为用户界面线程和工作者线程两种。 用户界面线程拥有自己的消息循环来处理界面消息,可以与用户进行交互。一个用户线程由CWinThread类派生开始,通常需要重载InitInstance()及ExitInstance()来完成线程的初始化和清除。在一个应用程序中,运行主线程通常由CWinApp的派生类提供,CWinApp由CWinThread派生,它是一个用户界面线程。 工作者线程没有自身的消息循环,一般用来完成后台工作。工作者线程可以完成后台计算、打印以及串行通讯等任务,它的特点是当需要一些耗时的操作时,可以使其在后台运行;同时主线程方便地接受用户的输入信息而不必等到这些操作完成。 (三)MFC中的线程 CWinThread类的对象代表在一个应用程序内运行的线程。CWinThread支持两种线程类型:工作者线程和用户界面线程。工作者线程没有收发消息的功能,用户界面线程具有收发消息的功能,并处理从系统收到的消息。CWinApp及其派生类是用户界面线程的例子。 CWinThread类的对象存在于线程的生存期。因为需要依赖CWinThread来处理线程局部数据,所以任何使用MFC的线程必须由MFC创建。 创建线程的方法: ①调用AfxBeginThread函数: 根据需要不管是工作线程还是用户界面线程,有两种调用AfxBeginThread的格式。如果需要用户界面线程,则将指向CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。如果需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。 对于工作者线程和用户界面线程,可以指定可选的参数来修改优先级,堆栈大小,创建标志和安全属性。AfxBeginThread线程将返回指向新的CWinThread对象的指针。 AfxBeginThread函数的声明: CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,LPVOIDpParam,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL); ②先构造一个CWinThread派生类的对象,然后调用CreateThread。 (四)线程的创建、启动和终止 1、线程的创建 ①创建一个工作者线程需要两步:首先完成控制函数的编写;然后用函数AfxBeginThread来启动线程。 例如: //控制函数的实现 UINTMyThread(LPVOIDpP