Windows程序设计第8章进程与线程.ppt
《Windows程序设计第8章进程与线程.ppt》由会员分享,可在线阅读,更多相关《Windows程序设计第8章进程与线程.ppt(21页珍藏版)》请在三一文库上搜索。
1、第8章 进程与线程,Win32操作系统平台提供了强大的多任务功能,其中 “进程”(Process)和“线程”(Thread)是其控制多任务的两个重要概念。早期的Windows 3.x只能依靠应用程序之间的协同来实现协同式多任务,而Windows 95/NT实行的是抢占式多任务。 在Win 32(Windows 95/NT)中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。对于象通信应用程序那样的既要进行耗时的工作,又要保持对用户输入响应的应用来说,使用多线程是最佳选择。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。,进程与子进程 进程(process)是计
2、算机操作系统中的概念。进程可以理解为:程序在给定的初始状态和内存区域中,能共行执行的一次“计算”,亦即,进程是可以和其它程序共行执行的,程序的一次执行。进程有独自的内存空间、程序代码、信息以及一堆大大小小的系统资源。另外,进程之间也有父子关系,产生进程的进程是“父进程”,被产生的进程是“子进程”,通常父进程对子进程有控制权,同时子进程也可以存取父进程的资源。,创建子进程API函数 下面介绍一个很重要的函数,即CreateProcess函数,其原型为: BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSE
3、CURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTURINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation); CreateProcess() 的功能是建立并执行child process。,其它函数 本节将介绍
4、一些可以协助我们取得process相关信息的函数。第一组要介绍的是最重要的GetCurentProcess()GetCurrentProcessId(), 前者会返回目前正在执行的process(也就是调用者)的handle, 后者会返回调用者的id。Handle和id有什么不同呢?id只是一个数字, Win32保证不会有第二个在系统中执行的process拥有相同的id, 因此,这个数字通常用来鉴别process的身份; process handle可就重要了, 因为其他与process有关的函数都需要它来当参数。 l HANDLE GetCurrentProcess(VOID); l DWO
5、RD GetCurrentProcessId(VOID); DWORD GetPriorityClass(HANDLE hProcess); BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);,结束process 如果某个process想停止执行, 可调用ExitProcess(), 不过我们通常不直接调用它, 而是调用C程序库中的exit(), exit()在自动执行一些清除垃圾的工作之后, 再调用ExitProcess()。 VOID ExitProcess(UNT uExitCode); 不过, 如果process
6、 A 想要迫使process B 停止执行, 可以在取得process B 的handle 之后, 调用TerminateProcess(): BOOL TerminateProcess(HANDLE hProcess, UNIT uExitCode);,进程与线程 前一节我们讨论了进程和子进程的有关概念和编程技术,实际上在Windows 操作系统环境中,Microsoft提出了线程是更具有挑战性的编程概念。在Windows 32位操作系统中,所谓多任务是指系统可以同时运行多个进程,而每个进程也可以同时执行多个线程。所谓进程就是应用程序的运行实例。一个进程又可以分为多个线程,根据线程的运行特征
7、,我们可以把它看成是操作系统分配CPU时间的基本实体。,Win16 的协同多任务 早在16位的Windows中,应用程序具有对CPU的控制权。只有在调用了GetMessage、PeekMessage、WaitMessage或Yield后,程序才有可能把CPU控制权交给系统,系统再把控制权转交给别的应用程序。如果应用程序在长时间内无法调用上述四个函数之一,那么程序就一直独占CPU,系统会被挂起而无法接受用户的输入。 有人可能会想到用CWinApp:OnIdle函数来执行后台工作,因为该函数是程序主消息循环在空闲时调用的。但OnIdle的执行并不可靠,例如,如果用户在程序中打开了一个菜单或模态对话
8、框,那么OnIdle将停止调用,因为此时程序不能返回到主消息循环中!在实时任务代码中调用PeekMessage也会遇到同样的问题。 折衷的办法是在执行长期工作时弹出一个非模态对话框并禁止主窗口,在消息循环内分批执行后台操作。对话框中可以显示工作的进度,也可以包含一个取消按钮以让用户有机会中断一个长期的工作。典型的代码如程序8.1所示。这样做既可以保证工作实时进行,又可以使程序能有限地响应用户输入,但此时程序实际上已不能再为用户干别的事情了。,Windows 95/NT的抢先式多任务 在32位的Windows系统中,采用的是抢先式多任务,这意味着程序对CPU的占用时间是由系统决定的。系统为每个程
9、序分配一定的CPU时间,当程序的运行超过规定时间后,系统就会中断该程序并把CPU控制权转交给别的程序。与协同式多任务不同,这种中断是汇编语言级的。程序不必调用象PeekMessage这样的函数来放弃对CPU的控制权,就可以进行费时的工作,而且不会导致系统的挂起。 例如,在Windows3.x 中,如果某一个应用程序陷入了死循环,那么整个系统都会瘫痪,这时唯一的解决办法就是重新启动机器。而在Windows 95/NT中,一个程序的崩溃一般不会造成死机,其它程序仍然可以运行,用户可以按Ctrl+Alt+Del键来打开任务列表并关闭没有响应的程序。,进程与线程 所谓进程就是应用程序的运行实例。每个进
10、程都有自己私有的虚拟地址空间。每个进程都有一个主线程,但可以建立另外的线程。进程中的线程是并行执行的,每个线程占用CPU的时间由系统来划分。 进程中的所有线程共享进程的虚拟地址空间,这意味着所有线程都可以访问进程的全局变量和资源。这一方面为编程带来了方便,但另一方面也容易造成冲突。 虽然在进程中进行费时的工作不会导致系统的挂起,但这会导致进程本身的挂起。所以,如果进程既要进行长期的工作,又要响应用户的输入,那么它可以启动一个线程来专门负责费时的工作,而主线程仍然可以与用户进行交互。,线程的创建和终止 线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息泵来处理界面消息,可以与用户进行
11、交互。工作者线程没有消息泵,一般用来完成后台工作。 MFC应用程序的线程由对象CWinThread表示。在多数情况下,程序不需要自己创建CWinThread对象。调用AfxBeginThread函数时会自动创建一个CWinThread对象。 当发生下列事件之一时,线程被终止: l 线程调用ExitThread; l 线程函数返回,即线程隐含调用了ExitThread; l ExitProcess被进程的任一线程显式或隐含调用; l 用线程的句柄调用TerminateThread; l 用进程句柄调用TerminateProcess。,线程的同步 多线程的使用会产生一些新的问题,主要是如何保证线
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 程序设计 进程 线程
链接地址:https://www.31doc.com/p-3486398.html