进程与线程 VC++软件开发课件

上传人:206****923 文档编号:57080552 上传时间:2018-10-18 格式:PPT 页数:33 大小:154.50KB
返回 下载 相关 举报
进程与线程 VC++软件开发课件_第1页
第1页 / 共33页
进程与线程 VC++软件开发课件_第2页
第2页 / 共33页
进程与线程 VC++软件开发课件_第3页
第3页 / 共33页
进程与线程 VC++软件开发课件_第4页
第4页 / 共33页
进程与线程 VC++软件开发课件_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《进程与线程 VC++软件开发课件》由会员分享,可在线阅读,更多相关《进程与线程 VC++软件开发课件(33页珍藏版)》请在金锄头文库上搜索。

1、进程与线程,主要内容,进程线程的基本知识 Win32进程处理方法 Win32线程处理方法 MFC线程处理方法 用户界面线程 工作线程,一、基本概念,进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一些所有权的集合,一个进程拥有内存,CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存,以及线程,文件和其他一些模块。,1.1 进程,进程的状态有三种: 运行:正在使用CPU 就绪:当前能够运行但由于系统正在运行其他进程而需要等待 阻塞:由于不能得到需要的除CPU以外的资源,当前进程不能运行,需要等待,1.2 线程的概念,线程是操作系统分

2、时调度分配CPU时间的基本实体。一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。一个线程可以执行程序的任意部分的代码,即使这部分代码被另一个线程并发地执行;一个进程的所有线程共享它的虚拟地址空间、全局变量和操作系统资源。,由于创建新进程必须加载代码,而线程要执行的代码已经被映射到进程的地址空间,所以创建、执行线程的速度比进程更快。,二、进程编程,因为MFC没有提供类处理进程,所以直接使用了Win32 API函数。可以在一个进程的线程中通过调用CreateProcess函数来创建一个进程,这个新建的进程拥有自己的私有地址空间和自己的线程,这个进程可以和源进程共享

3、资源(如句柄和变量),但是这两个进程不存在紧密的父子关系,即使源进程终止,这个进程仍然可以继续。,2.1 进程的管理和终止,取得当前进程的句柄和ID需要以下两个函数: HANDLE GetCurrentProcess(void) DWORD GetCurrentProcessId(void),2.2 取得和设置进程的优先级,进程一共有四个不同的优先级: 空闲:IDLE_PRIORITY_CLASS 普通:NORMAL_PRIORITY_CLASS 高:HIGH_PRIORITY_CLASS 实时:REALTIME_PRIORITY_CLASS,取得一个进程的优先级的函数如下: DWORD Ge

4、tPriorityClass(HANDLE hProcess)其中,参数hProcess是要取得优先级的进程的句柄。 设置一个进程的优先级的函数如下: BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass),2.3 进程的终止,终止一个进程有两种方法:最常用的方法是调用函数ExitProcess结束进程。另一种方法是调用函数TerminateProcess终止进程。在当前进程中调用函数ExitProcess就会结束当前进程。void ExitProcess(UNIT uExitCode);当需要在当前进程中结束其他进程时,就需

5、要调用函数TerminateProcess: void TerminateProcess (UNIT uExitCode);,2.4 判断一个进程是否终止,当一个进程终止或结束时就不能利用这个进程的句柄再对该进程进行操作,这就需要判断一个进程是否已经终止。可以利用函数GetExitCodeProcess来判断一个进程是否终止,如果终止,则取得这个进程的返回码,否则返回标志STILL_ACTIVE。BOOL GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode);,三、 Win32线程函数,Win32中关于线程的几个函数: CreateThr

6、ead():创建一个新线程 ExitThread():正常的结束一个线程的执行 TerminateThread():终止一个线程的执行 GetExitCodeThread():得到另一个线程的退出码 GetThreadPriority():得到线程的优先级 SetThreadPriority():设置一个线程的优先级 SuspendThread():挂起一个线程 ResumeThread():重启一个线程 CloseHand():关闭一个线程的句柄,3.1 线程的创建,使用CreateThread函数创建线程, HANDLE CreateThread( LPSECURITY_ATTRIBUTE

7、S lpThreadAttributes, /安全属性 DWORD dwStackSize, /堆栈空间大小 LPTHREAD_START_ROUTINE lpStartAddress, /线程操作函数 LPVOID lpParameter, /操作函数的参数 DWORD dwCreationFlags, / 是否挂起 LPDWORD lpThreadId /返回线程的ID );,3.2 SuspendThread和 ResumeThread函数,SuspendThread()的作用为暂停一个线程,ResumeThread()的作用为重启一个线程。它们都带有一个HANDLE型的参数,参数值为要

8、暂停或重启线程的句柄。 SuspendThread(HANDLE hThread) ResumeThread(HANDLE hThread),3.3 ExitThread,终止一个线程有两种方法:最常用的方法是调用函数ExitThread结束线程。另一种方法是调用函数TerminateThread终止线程。在当前线程中的一个线程调用函数ExitThread就会结束当前线程:void ExitThread(DWORD dwExitCode);这个函数用来结束当前线程,其中参数用来存放此线程的退出码。这是最正常的结束线程的方法。,TerminateThread,BOOL TerminateThre

9、ad(HANDLE hThread. /线程句柄DWORD dwExitCode /线程退出码)该函数是一个相当危险的函数,当调用该函数时,被终止的线程立即结束运行。线程没有机会执行用户模式的代码,不能释放初始化时分配的堆栈。所以除非很清楚线程的行为,否则不要用它来结束线程的运行。,3.4 取得线程的优先级的函数,获得一个线程的优先级的函数: int GetThreadPriority (HANDLE hThread) 参数hThread是要取得优先级的线程的句柄。 设置一个线程的优先级的函数: BOOL SetThreadPriority (HANDLE hThread, int nPrio

10、rity) 参数hThread是要取得优先级线程的句柄,参数nPriority就是要设置的优先级。,四、 MFC中多线程的实现,在Win32 API的基础之上,MFC提供了处理线程的类和函数。MFC对多线程进行一种简单的封装,其中每个线程都是从CWinThread类继承而来的。每一个应用程序的执行都有一个主线程,主线程也是从CWinThread类继承而来的。可以利用CWinThread对象创建应用程序执行的其他线程。处理线程的类是CWinThread,它的成员变量m_hThread和m_hThreadID是对应的Win32线程句柄和线程ID。MFC多线程编程中经常用到的几个全局函数是AfxBe

11、ginThread、AfxEndThread等。,MFC明确区分两种线程:用户界面线程(User interface thread)和工作者线程(Worker thread)。用户界面线程一般用于处理用户输入并对用户产生的事件和消息作出应答。工作者线程用于完成不要求用户输入的任务,如实时数据采集、计算等。,Win32 API并不区分线程类型,它只需要知道线程的开始地址以便开始执行线程。 CWinApp对象是用户界面线程对象的一个例子, CWinApp从类CWinThread派生并处理用户产生的事件和消息。,4.1 多线程编程相关的全局函数,1、AfxBeginThread 用户界面线程的Afx

12、BeginThread的原型如下: CWinThread* AFXAPI AfxBeginThread( CRuntimeClass* pThreadClass, /从CWinThread派生的 Runtime_Class类 int nPriority, /优先级 UINT nStackSize, /堆栈大小 DWORD dwCreateFlags, /是否挂起 LPSECURITY_ATTRIBUTES lpSecurityAttrs /安全参数 ),工作者线程的AfxBeginThread的原型如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREA

13、DPROC pfnThreadProc, /控制函数地址 LPVOID pParam, /传递给控制函数的参数 int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES pSecurityAttrs ),在创建一个新的线程时,不必直接创建线程对象,因为线程对象是由全局函数AfxBeginThread()自动产生的。只要定义一个CWinThread类指针,然后调用全局函数来产生一个新的线程对象,最后将新的线程对象的指针返回。应该将其保存在CWinThread成员变量中,以便能够进一步控制线程。,2、CWi

14、nThread * AFXAPI AfxGetThread 该全局函数用来获取线程对象。 3、VOID AFXAPI AfxEndThread(UNIT nExitCode,BOOL bDelete =TRUE)该函数用来结束线程的执行。 4、VOID AFXAPI AfxInitThread()初始化进程函数。 5、VOID AFXAPI AfxTermThread(HINSTANCE hInstTerm=NULL)终止线程执行函数。,4.2 CWinThread类,CWinThread类封装了上节讲的API函数,并且增加了新的函数和属性。至于其类的具体声明在afxwin.h中。,4.3 创

15、建用户界面线程,首先从CWinThread类派生一个类(需要用宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE对该类进行声明和实现,利用向导可以自动完成),然后调用函数AfxBeginThread创建CWinThread派生类的对象进行初始化,启动线程执行。,4.4 工作者线程的创建,工作线程经常来完成一些后台工作,如计算,打印等,这样用户就不必等待耗时的工作要创建工作线程,程序员不必从CWinThread派生新的线程类,只需要提供一个控制函数,由线程启动后执行该函数。然后,使用AfxBeginThread创建MFC线程对象和Win32线程对象。需要向AfxBegi

16、nThread函数提供线程函数的起始地址和传给线程函数的参数。线程函数的格式如下:UNIT 函数名(LPVOID pParam),工作者线程函数,因为工作者线程不需要用户的输入,因此它只会在指定的线程函数中运行。 线程函数的声明结构是固定格式,而且其代码的地址必须是唯一。所以只能声明为全局函数或者静态成员函数。 工作线程的参数是一个内存指针,只要做强制类型转换,就可以得到相应的数据类型。 由于该函数基本独立运作,要实现线程的通讯需要借助其他方法。如消息传递,全局变量等,UNIT 函数名(LPVOID pParam),桌面时间例子程序分析(UI),时钟面板(继承静态文本类):在一个静态文本控件中显示当前的时间。 时钟线程(继承CWinThread):控制打开时钟面板。 视图类:创建一个时钟线程对象,并运行该对象。,视图类,时钟线程,时钟面板,创建,创建,小球移动例子分析(Worker),小球类:保存小球的基本属性和常用方法 文档类:记录小球实例对象。创建线程控制小球运动。 线程工作函数,修改小球的位置,并发送消息要求视图刷新 视图类:绘制小球位置。响应自定义消息,发出更新命令。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号