【php精品源码栏目提醒】:以下是网学会员为您推荐的php精品源码-【精品】8windows核心编程 - 大学课件,希望本篇文章对您学习有所帮助。
第8章 进程与线程 Win32操作系统平台提供了强大的多任务功能,其中“进程”(Process)和“线程”Thread是其控制多任务的两个重要概念。
早期的Windows 3.x只能依靠应用程序之间的协同来实现协同式多任务,而Windows 95/NT实行的是抢占式多任务。
在Win 32Windows 95/NT中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。
对于象通信应用程序那样的既要进行耗时的工作,又要保持对用户输入响应的应用来说,使用多线程是最佳选择。
当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。
进程与子进程进程(process)是计算机操作系统中的概念。
进程可以理解为:程序在给定的初始状态和内存区域中,能共行执行的一次“计算”,亦即,进程是可以和其它程序共行执行的,程序的一次执行。
进程有独自的内存空间、程序代码、信息以及一堆大大小小的系统资源。
另外,进程之间也有父子关系,产生进程的进程是“父进程”,被产生的进程是“子进程”,通常父进程对子进程有控制权,同时子进程也可以存取父进程的资源。
创建子进程API函数下面介绍一个很重要的函数,即CreateProcess函数,其原型为: BOOL CreateProcessLPCTSTR lpApplicationName LPTSTRlpCommandLine LPSECURITY_ATTRIBUTES lpProcessAttributesLPSECURITY_ATTRIBUTES lpThreadAttributes BOOL bInheritHandlesDWORD dwCreationFlags LPVOID lpEnvironment LPCTSTRlpCurrentDirectory LPSTARTURINFO lpStartupInfoLPPROCESS_INFORMATION lpProcessInformationCreateProcess() 的功能是建立并执行child process。
其它函数本节将介绍一些可以协助我们取得process相关信息的函数。
第一组要介绍的是最重要的GetCurentProcessGetCurrentProcessId 前者会返回目前正在执行的process也就是调用者的handle 后者会返回调用者的id。
Handle和id有什么不同呢?id只是一个数字, Win32保证不会有第二个在系统中执行的process拥有相同的id 因此,这个数字通常用来鉴别process的身份; process handle可就重要了, 因为其他与process有关的函数都需要它来当参数。
l HANDLE GetCurrentProcessVOIDl DWORD GetCurrentProcessIdVOID DWORD GetPriorityClassHANDLE hProcess BOOL SetPriorityClassHANDLE hProcess DWORDdwPriorityClass 结束process 如果某个process想停止执行, 可调用ExitProcess 不过我们通常不直接调用它, 而是调用C程序库中的exitexit 在 自 动 执 行 一 些 清 除 垃 圾 的 工 作 之 后 , 再 调 用ExitProcess。
VOID ExitProcessUNT uExitCode 不过, 如果process A 想要迫使process B 停止执行,可 以 在 取 得 process B 的 handle 之 后 , 调 用TerminateProcess: BOOL TerminateProcessHANDLE hProcess UNITuExitCode 进程与线程 前一节我们讨论了进程和子进程的有关概念和编程技术,实际上在Windows 操作系统环境中,Microsoft提出了线程是更具有挑战性的编程概念。
在Windows 32位操作系统中,所谓多任务是指系统可以同时运行多个进程,而每个进程也可以同时执行多个线程。
所谓进程就是应用程序的运行实例。
一个进程又可以分为多个线程,根据线程的运行特征,我们可以把它看成是操作系统分配CPU时间的基本实体。
Win16 的协同多任务 早在16位的Windows中,应用程序具有对CPU的控制权。
只有在调用了GetMessage、PeekMessage、WaitMessage或Yield后,程序才有可能把CPU控制权交给系统,系统再把控制权转交给别的应用程序。
如果应用程序在长时间内无法调用上述四个函数之一,那么程序就一直独占CPU,系统会被挂起而无法接受用户的输入。
有人可能会想到用CWinApp::OnIdle函数来执行后台工作,因为该函数是程序主消息循环在空闲时调用的。
但OnIdle的执行并不可靠,例如,如果用户在程序中打开了一个菜单或模态对话框,那么OnIdle将停止调用,因为此时程序不能返回到主消息循环中!在实时任