程序、进程和线程

程序、进程和线程

ID:41541555

大小:48.20 KB

页数:7页

时间:2019-08-27

上传者:U-991
程序、进程和线程_第1页
程序、进程和线程_第2页
程序、进程和线程_第3页
程序、进程和线程_第4页
程序、进程和线程_第5页
资源描述:

《程序、进程和线程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

本草重难点解析一、程序、进程和线程二、在VC++环境中使用同步对象一、程序、进程和线程(一)进程与线程进程是装入内存中即将执行的程序,可以包含一个或多个运行在它的上下文坏境内的线程。在操作系统技术中,进程利线#出现捉高了系统的并行性,从而使应用程序更冇效地利用系统资源,多线程的应用程序也就应运而生了。在Win32(95/98/NT)中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。当进程使用多彳程时,需要采取适当的措施来保持线程间的同步。在许多时候,需要使用多线程,例如在与用户交互的同时进行后台计算的处£通信。在Win95/98/NT系统中,一个程序的朋溃一般不会造成死机,其他程序仍然可以运行,用户可以通过按Ctrl+Alt+Del毬打开任务列表并关闭没冇响应的程序而不影响其他正在运行的应用程序。这是多线程的作用。多任务是指系统可以同吋运行多个进程,而每个进程也可以同吋执行多个线程。一个程序可以同吋运行多个线程,每个线不立地执行程序代码屮的一组语句。进程就是应用程序的实例。每个进程都有自己私有的虚拟地址空间。每个进程都有一个主线:但可以建立另外的线程,进程中的线程是并行执行的,每个线程占用CPU的吋间由系统來划分。线程是Win95/98/NT系统调度的基木单位,系统启动时,一个进程至少冇一个线程,进程可以通过调用运行库函数或Win32函数来增加线程。线程可以看成是操作系统分配CPU时间的基本实体,系统不停地在各个线程之间进行切换。(二)线程的种类线程分为用户界面线程和工作者线程两种。用户界而线程拥有自己的消息循环来处理界而消息,可以与用户进行交互。一个用户线程由CWinThread类派生开始,通彳要重载InitlnstanceO及Exitinstance()來完成线程的初始化和清除。在一个应用程序中,运行主线程通常由CWinApp生类提供,CWinApp由CWinThread派生,它是—•个用户界面线程。工作者线程没有自身的消息循环,一般用来完成后台工作。工作者线程可以完成后台计算、打印以及串行通讯等任务,它E点是当需耍一些耗时的操作时,可以使其在后台运行;同时主线程方便地接受用户的输入信息而不必等到这些操作完成。(三)MFC中的线程CWinThread类的对彖代农在一个应用程序内运行的线程。CWinThread支持两种线程类型:工作者线程和用户界而线程。作者线程没有收发消息的功能,用户界面线程具有收发消息的功能,并处理从系统收到的消息。CWinApp及其派生类是用户芋线程的例子。CWinThread类的对象存在于线程的生存期。因为需要依赖CWinThread来处理线程局部数据,所以任何使用MEC的线程4由MFC创建。创建线程的方法:①调用AfxBeginThread函数: 根据需耍不管是工作线程还是用户界面线程,冇两种调用AfxBeginThread的格式。如果需耍用户界面线程,则将指向CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。如果需要创建工作者线程,则将指向控制函数的指针才制两数的参数传递给AfxBeginThreado对于工作者线程和用户界面线程,可以指定可选的参数來修改优先级,堆栈大小,创建标志和安全属性。AfxBeginThreac程将返回指向新的CWinThread对象的指针。AfxBeginThread函数的声明:CWinThread*AfxBeginThread(AFXTHREADPROCpfnThreadProc,I.PVOTDpParam,intnPriority=THREADPRTORTTYNORMAL,UIN'nStackSize=O,DWORDdwCreateFlags=O,LPSECUR1TY_ATTR1BUTESlPSecurityAttrs=NULL);①先构造一个CWinThread派生类的对彖,然后调用CreateThread,(四)线程的创建、启动和终止1、线程的创建①创建一个工作者线程需要两步:首先完成控制函数的编写;然后用函数AfxBeginThread来启动线程。例如://控制两数的实现UINTMyThread(LPVOIDpParam){CMyObject*pObject=(CMyObject*)pParam;if(pObject==NULL||!pObject->IsKindOf(RUNTIMECLASS(CMyObject)))returnT;AfxEndThread(2);添加特定代码。。。//用pObject对象來完成某项工作Return0; //主线程屮的线程控制调用pNewObject=newCMyObject;AfxBeginThread(MyThread,pNewObject);②创建用户界面线程:程序中默认的WinMainO函数调用CWinApp::Run(),在调用CWinThread::Run0函数以建立消息循i派生类CWinApp必须用DECLARE_DYNCREATE和1HPLE〈EHT_DYNCREATE宏來声明和实现,并需要逼载派生类的InitlnstcinceExitinstance、Run等函数。例2_1、创建一个逆序显示字符串的工作者线程分析:第一步:创建一个线程控制函数:U1NTM艸orkThreadFunction(LPVOIDpParam){CWnd*pMainWnd=AfxGetMainWnd();if(pParajn==NULL){::MessageBox(pMainWnd->m_hWnd,”ParamerrorwnThreaderrorw,MB_0K);AfxEndThrecid(2);)CString*pStr=(CString*)pParam;pStr->MakeReverse();::MessageBox(pMainWnd->m_hWnd,wThreadrun!”,MBOK);Return0;}第二步:在主线程屮调用控制函数AfxBeginThread(MyWorkThreadFunction,(LPVOTD)pString);具体操作步骤如下:利用MFCAppWizard(exe)创建应用程序Ex2_l<.选择单文档类型。 •打开资源视图,对Menu项的1DR_MA1NFRAME进行编辑,在主菜单中加入“线程”菜单项,在其下拉菜单中加入两个选兀“工作线程”菜单项。ID值:IDJV0RKTI1READ;“用户界面线程”菜单项。ID值:ID_UITIIREAD。•利用类向导填加消息映像函数:对TDWORKTHREAD对象的COMMAND消息添加函数OnWorkThreadO;对TDUTTHREAD见的COMMAND消息添加函数OnUithread0。•在MainFrm.cpp文件中添加:#includc,zafxmt・h"UINTMyWorkThreadFunction(LPVOIDpParam):CStringHyString二"Iamusingmyfirstworkthreadnow・";voidCMainFrame::OnWorkthread(){CDC*pDC=GetDC();pDC->TextOut(30,40,"Stringbeforechange:");pDC->TextOut(50,80,MySlring);CString*pString;pSlring=&HyString;A「xBeginThread(MyWorkThreadFunction,(LPVOTD)pString);pDC->TextOut(30,120,^stringafterchange:");pDC->TextOut(50,160,MyString);RelcascDC(pDC);}•在Ex2_lView.cpp文件屮添加:UTNTMyWorkThreadFunction(LPVOTDpParam) CWnd*pMainWnd=AfxGetMainWnd();if(pParam==NULL){::MessageBox(pMainWnd->mhWnd,77Paramerror","Threaderror,,>MBOK);AfxEndThread(2);}CString*pStr^(CString*)pParam;pStr->MakeReverse();MessageBox(pMainWnd->m_hWnd,"Threadrun!","Threadrun,z,MB_OK);return0;程序运行结果图如下:程序运行结果:程序代码卞载:例22、在例2_1的某础上创建一个用户界而线程,要求弹出一个新的线程窗口,其标题栏显示UTThreadwindow,并且彳客户区视图中显示一行字符:WelcometomyfirstUTthreadInterface□操作步骤如下:•使用类向导生成1个由CWinThread类派生的用户界面线程类,名为UseThread。对所生成的类的TnitInstance()函娄行重载,添加如下代码:BOOLUseThread::InitlnstanceO {//TODO:performandper-threadinitializationhereCDC*pDC;CFrameWnd*pFrameWnd=ncwCFramcWnd();pFrameWnd->Create(NULL,^UTThreadWindow");pFrameWnd~>ShowWindow(SW_SHOW);pDC=pFrameWnd->GetDC();pDC->TextOut(20,20,^MyFirstUIthreadinterface");pFrameWnd->UpdateWindow();returnTRUE;}•在MainFrm.cpp文件中添加代码:#includc^UseThread・h"voidCMainErame::0nUithread(){AfxBeginThrecid(RUNTIME_CLASS(UseThread));}注意:此题的源码与例2_1合在--起,请看上题的运行结果。②线程的启动:当使用全局函数AfxBeginThreadO创建一个工作者线程吋,参数dwCreateFlags指定了线程的初始状态,通常为0,那么纟在创建后立即执行,如呆为CREATESUSPENDED,则线程在创建后就被挂起。被挂起的线程直到英他线程调用RcsumcThrcadO数时,此线程才能继续执行。线程的终止:当下列事件之一发生时,线程将被终止:(1)线程调用ExitThreado如果线程由ExitThread终止,则所有附属DLL的入口点两数用一个指示线程从DLL解脱金码激活。(2)线程函数返回,即线程隐含调用了ExitThreado(3)函数原形为VOIDExitThread(UINTfuExitCode)。 (4)这个函数为调用该函数的线程设置了退出码fuExitCode后,就被终止该线程。(5)函数ExitProcess被进程的任一线程显示或隐含调用。(6)用线程的句柄调用TerminateThread,此时Windows不通知DI丄。(7)用进程句柄调用TerminateProcess。(8)调用全局函数AfxEndThread。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭