VC++程序第14章-使用多任务课件

上传人:pu****.1 文档编号:567630461 上传时间:2024-07-21 格式:PPT 页数:19 大小:366.50KB
返回 下载 相关 举报
VC++程序第14章-使用多任务课件_第1页
第1页 / 共19页
VC++程序第14章-使用多任务课件_第2页
第2页 / 共19页
VC++程序第14章-使用多任务课件_第3页
第3页 / 共19页
VC++程序第14章-使用多任务课件_第4页
第4页 / 共19页
VC++程序第14章-使用多任务课件_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《VC++程序第14章-使用多任务课件》由会员分享,可在线阅读,更多相关《VC++程序第14章-使用多任务课件(19页珍藏版)》请在金锄头文库上搜索。

1、概述nWindows是一个抢先式多任务操作系统。所谓多任务是指它可以允许多个进程同时运行,而每个进程又由一个或多个线程组成,这些线程也可以同时运行,所谓抢先是指操作系统可以在任何时候挂起当前进程或线程的执行,把CPU控制权转交给别的进程或线程继续执行。n在操作系统中,一个进程通常就是一个运行着的程序,它可以由一个或多个模块组成,每个模块通常对应磁盘上的一个文件,如EXE或DLL文件。而一个线程通常就是这个程序中可以并行运行的某一个全局函数。本章将讲述进程和线程的使用方法。1进程 n进程的优先级 一个进程(process)是应用程序的一个运行实例,进程并不一定都有窗口或显示在屏幕上,每个进程都有

2、自己的内存空间、代码、数据和系统资源。一个进程在运行的过程中创建的资源随着进程的终止而被销毁,分配的系统资源在进程终止时被释放或关闭。在Windows系统中,对每个进程可设置不同的优先级,Windows系统内部的调度程序根据进程的优先级来酌情分配CPU时间以使进程运行。一般情况下,进程优先级应被设置成标准级NORMAL_PRIORITY_CLASS,教材表14-1是Windows定义的进程优先级类型。2进程 n启动进程 nCreateProcess()该函数是基本的启动进程函数,其函数原型定义如下:BOOL CreateProcess( LPCTSTR lpApplicationName, L

3、PTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); 3进程 nCreateProcess示例以下程序

4、代码启动注册表程序:STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory( &si, sizeof(si) );si.cb = sizeof(si);ZeroMemory( &pi, sizeof(pi) );if(!CreateProcess(NULL,regedit,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi) AfxMessageBox( 建立进程失败! );4进程 nWinExec()启动进程该函数内部调用CreateProcess()启动进程,其原型定义如下:UINT WinExec(LPCSTR lpCmdLi

5、ne,UINT uCmdShow);参数lpCmdLine为命令行参数。参数uCmdShow为窗口的样式,该值用于ShowWindow (HWND hwnd, int nCmdShow)中的nCmdShow来显示窗口,参见本书“1.3简单的Windows程序介绍”一节内容。以下程序代码启动注册表程序:if(WinExec(regedit.exe,SW_SHOWNORMAL)) AfxMessageBox( 建立进程失败! ); nC/C+语言中的启动进程函数启动进程 5进程 n进程的管理 n取得当前进程的句柄及ID nGetCurrentProcess nDuplicateHandle nGe

6、tCurrentProcessID n取得其它进程的句柄及ID nCreateToolhelp32Snapshot nProcess32First nProcess32Next nOpenProcess 6进程 n取得和设置进程的优先级n取得进程优先级,hProcess为目标进程句柄:DWORD GetPriorityClass(HANDLE hProcess);n设置进程优先级,hProcess为进程句柄:dwPriorityClass为进程新的优先级:DWORD SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass); n终止进程

7、n在一进程任务完成后,可以调用函数ExitProcess()结束进程:VOID ExitProcess(UINT uExitCode) n函数TerminateProcess() 可以结束调用进程和其它进程:BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);7线程 n线程的优先级 线程(Thread)是进程内部的一个可执行路径。例如,启动“记事本”程序时,操作系统将创建进程并开始执行进程的主线程(primary thread)。所有进程至少拥有一个线程,即主线程,主线程终止,进程终止。多个线程可以并发或并行的运行于同一个进程之中,每个

8、线程都共享它们的进程的内存空间、全局变量和系统资源等。同进程一样,线程也有优先级。Windows定义了线程的优先级类型,合理使用这些优先级可以改善程序性能。例如,通常从调制解调器接收数据的线程比需要从磁盘文件读取数据的进程更高的优先级,因为从调制解调器接收数据的线程必须及时接收传来的数据,而磁盘文件上的数据一直都有。教材表14-7列举了线程优先级类型及其说明。8线程 n线程的创建和终止 n线程的创建nMFC使用AfxBeginThread()函数在创建线程nWindows API使用CreateThread()函数创建线程。 n为线程函数,它的原型必须按照如下方式定义: UINT Thread

9、Proc(LPVOID pParam);n线程的终止 n工作者线程,退出线程函数的同时即可正常终止线程 。nAfxEndThread()、ExitThread()或者使用return(即线程隐含调用了ExitThread)来终止所在的线程。 nTerminateThread() 终止线程。 9线程 n工作者线程 n工作者线程不处理Windows消息,通常比用户接口线程简单。 n创建一个工作者线程。CWinThread* thread = AfxBeginThread(ThreadProcedure, pParam); n线程函数代码示例UINT WorkerThread(LPVOID pPar

10、am)char* pMessage = (char *)pParam;AfxMessageBox(pMessage);return 0;n启动线程代码示例AfxBeginThread(WorkerThread, 工作者线程运行!); 10线程 n用户接口线程 n用户接口线程含有消息循环,通常较工作者线程复杂。 n从CWinThread类派生一个线程类,n重载InitInstance()函数,执行初始化任务。n重载ExitInstance()函数,清除自身。 n代码示例:n添加CWinThread 派生类CMyThread n修改CWinThread类的InitInstance()函数 BOOL

11、 CMythread:InitInstance()CFrameWnd* pFrameWnd = new CFrameWnd();pFrameWnd-Create(NULL, “Thread Window”); /创建线程窗口pFrameWnd-MoveWindow(0,0,150,150); return TRUE;n启动线程AfxBeginThread(RUNTIME_CLASS(CMyThread); 11进程、线程间的同步 n概述 n同步技术可以解决多个进程、线程在访问共享资源时发生冲突问题。n假设两个线程同时访问一个共享数据,甲线程进行数据修改,乙线程进行数据读取。由于Windows为

12、抢先式多任务操作系统,当甲线程在数据修改到一半时,系统可能会挂起甲线程,让乙线程运行,乙线程将读到错误数据,导致程序运行出错。n为了避免冲突,Windows系统内部定义了四个同步对象和一组等待函数,合理的使用它们可以解决多进程、多线程间的同步问题。nMFC中CEvent类、CCriticalSection类、CMutex类和CSemaphore类封装了四个同步对象的操作,这4个类从一个纯虚基类CSyncObject派生,CSyncObject类包含两个重要函数:virtual BOOL Lock( DWORD dwTimeout = INFINITE );该函数判断同步对象是否可用,如果可用获

13、得对象virtual BOOL Unlock() 该函数释放调用线程所拥有的同步对象, 12进程、线程间的同步 n等待函数nWaitForSingleObject该函数挂起当前线程,直到满足条件后才返回。它的原型定义如下:DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);参数hHandle是同步对象句柄,对象都被激活后返回WAIT_OBJECT_0;参数dwMilliseconds以毫秒为单位,如果为0,那么函数就测试同步对象的状态并立即返回,如果为INFINITE,则超时间隔是无限的。 nWaitForMultip

14、leObjects n该函数挂起当前线程,直到满足条件后才返回。它的原型定义如下:DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles , BOOL bWaitAll,DWORD dwMilliseconds ); 参数nCount是句柄数组中句柄的数目。 参数lpHandles代表一个句柄数组。参数bWaitAll说明了等待类型13进程、线程间的同步 n使用事件CEventMFC的CEvent类封装事件的操作。通常当应用程序必须等到发生某事才能访问资源时,使用 CEvent对象。 nCCriticalSectio

15、n nCMutex nCSemaphore 14进程、线程间的同步 n使用事件CEventn用法MFC的CEvent类封装事件的操作。通常当应用程序必须等到发生某事才能访问资源时,使用 CEvent对象。 n状态n活动(signal state)n沉寂 (nosignal state) n示例#include /包含头文件CEvent Event;/建立沉寂的、自动的全局CEvent对象,用于线程同步CString csString;/建立全局CString对象,用于存储字符串信息UINT Thread(LPVOID pParam)/显示字符串信息的线程while(1)Event.Lock()

16、;/或WaitForSingleObject(Event,INFINITE);/等待Event被激活,当函数返回后Event将自动设为沉寂AfxMessageBox(csString);15进程、线程间的同步 n使用临界段 CCriticalSectionn用法CCriticalSection类封装临界段的操作 。通常当一个应用程序的多个线程需要访问同一资源时,使用 CCriticalSection对象。 n状态n解锁 n加锁 nUnLock()、Lock()进行设置 n示例CCriticalSection CriticalSection; /建立全局CCriticalSection对象,解锁

17、状态UINT Thread1(LPVOID pParam) /线程1while(1)CriticalSection.Lock();/等待CCriticalSection被解锁,/当函数返回后CriticalSection将被锁定AfxMessageBox(线程1占有临界段,按放弃临界段);CriticalSection.Unlock();16进程、线程间的同步 n使用互斥量 CMutex n用法互斥量与临界段功能基本相同。区别在于:临界段只能用于进程内的同步,互斥量可以用于多个进程间的同步。 n状态n解锁 n加锁 nUnLock()、Lock()进行设置 n示例CMutex Mutex(FAL

18、SE,Mutex);UINT Thread(LPVOID pParam)while(1)Mutex.Lock();AfxMessageBox(线程占有临界段,按放弃临界段);Mutex.Unlock();17进程、线程间的同步 n使用信号量 CSemaphore n用法信号量能够限制应用程序中访问同一资源的线程数。n状态nUnLock()、Lock()进行设置 n示例CSemaphore Semaphore(3,3,Semaphore);UINT Thread(LPVOID pParam)int ID=IDOK;while(ID=IDOK)Semaphore.Lock();ID=AfxMess

19、ageBox(放弃信号量,退出线程, MB_OKCANCEL);Semaphore.Unlock();return 0;18习题 1.什么是多进程、多线程?在编写多进程、多线程应用程序须注意什么?2.用本章中所介绍启动进程的几种方法来编写一个应用程序。3.完善在内存映像文件中所举的实例,在读取、显示、修改内存映像文件的函数添加代码,并添加关闭内存映像文件的处理。4.工作者线程(worker thread)与用户接口线程(ueser interface thread)使用的场合?5.在Windows中通常使用事件对象的方法进行线程间通信,请编写一个应用程序。6.在线程同步时常使用事件对象、临界段、互斥量、信号量方法,请说明每一种方法各自的特点。7.使用事件对象的方法编写一个简单的应用程序,按鼠标左键开始进程,按鼠标右键结束进程。8.使用临界段的方法编写一个应用程序,开辟一块共享内存,一个线程每300毫秒修改一次共享内存的值,另一个线程每200毫秒显示共享内存的值。9.使用互斥量的方法编写一个应用程序完成进程间的通讯,两个进程同时向一段内存写数据。10.使用信号量编写一个应用程序,初始资源数和最大资源数都为3,在窗口客户区单击鼠标左键启动线程调用函数并弹出一个对话框,单击右键一下则释放资源一次。19

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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