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

上传人(卖家):三亚风情 文档编号:3604858 上传时间:2022-09-24 格式:PPT 页数:19 大小:366.50KB
下载 相关 举报
VC++程序第14章-使用多任务课件.ppt_第1页
第1页 / 共19页
VC++程序第14章-使用多任务课件.ppt_第2页
第2页 / 共19页
VC++程序第14章-使用多任务课件.ppt_第3页
第3页 / 共19页
VC++程序第14章-使用多任务课件.ppt_第4页
第4页 / 共19页
VC++程序第14章-使用多任务课件.ppt_第5页
第5页 / 共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,LPT

3、STR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation );3进程 nCreateProcess示例以下程序代码启动注册表程序:S

4、TARTUPINFO 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 lpCmdLine,UINT uCmdShow);参数lpCm

5、dLine为命令行参数。参数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 nGetCurrentProcessID n取得其它进程的句柄及I

6、D nCreateToolhelp32Snapshot nProcess32First nProcess32Next nOpenProcess 6进程 n取得和设置进程的优先级n取得进程优先级,hProcess为目标进程句柄:DWORD GetPriorityClass(HANDLE hProcess);n设置进程优先级,hProcess为进程句柄:dwPriorityClass为进程新的优先级:DWORD SetPriorityClass(HANDLE hProcess,DWORD dwPriorityClass);n终止进程 n在一进程任务完成后,可以调用函数ExitProcess()结束

7、进程: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 ThreadProc(LPVOID pParam);n线程的终止 n工作者线程,退出线

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

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

11、Wnd();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);该函数判断同步对象是否可用,如果可用获得对象virtual BOOL Unlock()该函数释放调用线程所拥有的同步对象,12进程、线程间的同步 n等待函数nWaitFo

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

14、DWORD nCount,CONST HANDLE*lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);参数nCount是句柄数组中句柄的数目。参数lpHandles代表一个句柄数组。参数bWaitAll说明了等待类型13进程、线程间的同步 n使用事件CEventMFC的CEvent类封装事件的操作。通常当应用程序必须等到发生某事才能访问资源时,使用 CEvent对象。nCCriticalSection nCMutex nCSemaphore 14进程、线程间的同步 n使用事件CEventn用法MFC的CEvent类封装事件的操作。通常当应用程序必须等到

15、发生某事才能访问资源时,使用 CEvent对象。n状态n活动(signal state)n沉寂(nosignal state)n示例#include/包含头文件CEvent Event;/建立沉寂的、自动的全局CEvent对象,用于线程同步CString csString;/建立全局CString对象,用于存储字符串信息UINT Thread(LPVOID pParam)/显示字符串信息的线程while(1)Event.Lock();/或WaitForSingleObject(Event,INFINITE);/等待Event被激活,当函数返回后Event将自动设为沉寂AfxMessageBox

16、(csString);15进程、线程间的同步 n使用临界段 CCriticalSectionn用法CCriticalSection类封装临界段的操作。通常当一个应用程序的多个线程需要访问同一资源时,使用 CCriticalSection对象。n状态n解锁 n加锁 nUnLock()、Lock()进行设置 n示例CCriticalSection CriticalSection;/建立全局CCriticalSection对象,解锁状态UINT Thread1(LPVOID pParam)/线程1while(1)CriticalSection.Lock();/等待CCriticalSection被解

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

18、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=AfxMessageBox(放弃信号量,退出线程,MB_OKCANCEL);Semaphore.Unlock();return 0;18习题 1.什么是多进程、多线程?在编写多进程、多线程

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(VC++程序第14章-使用多任务课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|