Windows任务管理器的设计与实现

2018-09-27 19:05

毕业设计(作业)

学生院

学生提

题 教

师 姓名 名

称 班

级 学号 日

Windows任务管理器设计与实现

2015年12月19日

::::::

摘 要

据国外研究公司统计,在2008年全球个人计算机用户已经超过10亿,并预测在2010年全球个人计算机用户数量将超过13亿。随着个人计算机走进千家万户,计算机操作系统中的任务管理器也被越来越多的用户所熟悉和使用。

任务管理器是在Windows系统中管理应用程序和进程的工具,通常由Windows操作系统自带,也有提供增强功能的第三方软件。通过任务管理器用户可以方便的查看当前运行的程序、进程、用户、网络连接以及系统对内存和CPU的资源占用,并可以强制结束某些程序和进程,此外还可以监控系统资源的使用状况。

Windows 任务管理器首次出现是在1998年美国微软公司发行的Windows98操作系统中,此后微软的各个版本的Windows操作系统都集成了任务管理器。任务管理器并不是Windows系统的专利,它广泛运用于各种操作系统中,在苹果公司的Mac OS 操作系统中有类似的活动监视器(Activity Monitor),在基于Linux的ubuntu操作系统有相类似功能的系统监视器。

Windows任务管理器提供了有关计算机性能的信息,并显示了计算机上所运行的程序和进程的详细信息;如果连接到网络,那么还可以查看网络状态并迅速了解网络是如何工作的。它的用户界面提供了文件、选项、查看、窗口、关机、帮助等六大菜单项,其下还有应用程序、进程、性能、联网、用户等五个标签页。

课题设计就是模拟Windows任务管理器,开发的一个Windows进程管理软件。主要设计的是一个基于窗体的C#程序,在主对话框上面放置了一个标签控件,并创建了应用程序、进程和性能三个页面,标签控件用于选择并显示页面。三个页面分别用于显示当前运行的窗口程序、进程及进程模块、系统资源使用情况。程序还实现了结束任务、等对进程管理的基本功能。在的设计过程中,通过调用Windows API函数而获得任务、进程、线程模块,以及系统资源使用情况等信息。最后在Windows10系统上进行测试,实现了进程管理的基本功能。 关键词:任务管理器;线程;进程;API

目 录

摘 要 ...................................................................................................... 1 目 录 ....................................................................................................... i

第一章 引言 ........................................................................... 1

1.1课题背景.............................................. 1 1.2国内外研究状况 ....................................... 1 1.3课题研究意义 ......................................... 1 1.4论文的主要研究内容 ................................... 2 1.5开发环境MicrosoftVisualStudio简介 ................... 2

1.5.1发展历程 ........................................ 2 1.6进程与线程简介 ....................................... 4

1.6.1线程简介 ........................................ 5 1.6.2进程与线程的关系 ................................ 6 1.6.3Windows自带的任务管理器分析 ..................... 6

第二章 主要功能及设计思路 .................................................. 8

2.1 主要功能 ............................................. 8 2.2 设计思路 ............................................. 8

第三章 主要功能实现 ............................................................. 8

3.1主框架的实现 ......................................... 8

3.1.1 子对话框的显示 ................................. 9 3.1.2提升程序的权限 .................................. 9 3.2列表页面设计 ........................................ 10

3.2.1显示任务信息 ................................... 10 3.3进程列表页面设计 .................................... 12

3.3.1显示进程信息 ................................... 13 3.3.2结束进程 ....................................... 16 3.4系统性能设计页面 .................................... 17

3.4.1显示进程信息 ................................... 17 3.4.2内存使用率 ..................................... 20

第四章 测试结果 .................................................................. 24

4.1测试环境............................................. 24 4.2测试方法............................................. 24 4.3测试结果............................................. 24

-i-

结论 ..................................................................................... 28 参考文献 .............................................................................. 29 致 谢 ................................................................................ 30

-ii-

第一章 引言

1.1课题背景

随着计算机的广泛应用,很多的软件被安装在计算机上,使计算机运行的程序进程越来越多;很多的程序在运行时常出现异常(如不能正常结束、占用大量资源、发现异常的进程等)。这些现象给我们的计算机使用及管理带来很多的不便。为了给计算机上运行的程序进行很好的管理,现在出现了许多的进程管理工具软件。课题设计的目的主要是为了检查综合运用以前所学知识(包括以前所学的一些关于计算机操作系统、进程、计算机安全、编程等知识)的能力,模拟一个Windows任务管理器。对任务、进程进行查看、结束等操作。

1.2国内外研究状况

从现状看来,Windows任务管理工具及其理论的研究,无论是国外还是国内,技术都相当成熟。微软Windows操作系统系列(98和ME除外)都自带有任务管理器,但Windows8之前版本的任务管理器功能不是很完善,不能查看进程模块及线程信息,而之后的版本的Windows任务管理软件都具有完善的功能。

1.3课题研究意义

研究任务管理器的功能并熟练的使用任务管理器可以方便的处理计算机日常使用中所遇到一些问题,对于更好的使用计算机操作系统从事办公、学习和娱乐也有现实的意义。

随着计算机技术的迅猛发展,计算机的运用给人们带来了很多便利,无论是学习,办公,还是商务。一款好的系统管理软件能大大地提高计算机的使用和管理效率,进程管理器就能很好地对系统上运行的进程进行管理。很多人都使用过进程管理器之类的软件,或者是Windows自带的任务管理器,它们都能够对进程进行管理。课题设计选择开发一个进程管理器软件,能够使自己综合运用以前所学知识(包括操作系统、编

-1-

程、系统安全等知识)的能力,同时也使自己了解当今软件编程的一些新的技术;既锻炼了自己的实际动手能力,又引导自己进行了一次模拟实际产品的开发,对于自己以后工作能力的培养具有重要的意义。

Windows的任务管理器只能显示系统中当前进行的进程,而Process Explorer可以树状方式显示出各个进程之间的关系,即某一进程启动了哪些其他的进程,还可以显示某个进程所调用的文件或文件夹,如果某个进程是Windows服务,则可以查看该进程所注册的所有服务。

其实,任务管理器除了终止任务、结束进程、查看性能外,它还可以完成很多更高级的特别任务。

1.4课题的研究方法

本软件使用Microsoft Visual Studio 2010的开发环境,模拟Windows的任务管理器进行设计与开发。因此,课题设计应首先分析进程管理器软件的相关功能;其次,综合运用以前所学的相关知识,广泛查阅资料(尤其是进程、线程及其相关知识),选择所熟悉的开发工具进行开发;同时,在开发设计与实现中,要保存好相关的设计文挡。

1.5开发环境Microsoft Visual Studio介绍

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。最新版本为 Visual Studio 2015 版本,基于.NET Framework 4.5.2

1.5.1发展历程

C++灵活又小巧,C++ Builder开发效率高;Turbo C是万人迷,Visual Studio的资格老。可如今,江湖上只剩下最后一个大佬Visual Studio了,其他几位不是支。

持者渐少,不成气候,就是转投他人怀抱,中道衰落,让人难免生出几分遗憾。但是反过来,我们又对Visual Studio这位“江湖最后的大

-2-

佬”增添了几分敬仰之情。据说这位老大又要出新的版本了,这些江湖八卦者,哪有错过的道理。要想深入的了解一个人,需要从他的童年开始。想了解Visual Studio,故事也就要从它的1.0开始。

Visual Studio 可以用来创建Windows平台下的 Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office插件。

1992年4月,微软发布了革命性的操作系统Windows 3.1,把个人计算机引进了真正的视窗时代。微软在原有C++开发工具Microsoft C/C++ 7.0的基础上,开创性地引进了MFC(Microsoft Foundation Classes)库,完善了源代码,成为Microsoft C/C++ 8.0,也就是Visual C++1.0,并于1992年发布。Visual C++ 1.0是真正意义上的Windows IDE,这也是Visual Studio的最初原型。虽然以现在的眼光来看,这个界面非常简陋和粗糙,但是它脱离了DOS界面,让用户可以在图形化的界面下进行开发,把软件开发带入了可视化(Visual)开发的时代。从此,大佬的时代开始了。

1997年,微软发布了 Visual Studio 97。包含有面向 Windows 开发使用的Visual Basic 5.0、Visual C++ 5.0,面向Java开发的Visual J++和面向数据库开发的 Visual FoxPro,还包含有创建 DHTML (Dynamic HTML) 所需要的 Visual InterDev。其中,Visual Basic 和 Visual FoxPro 使用单独的开发环境,其他的开发语言使用统一的开发环境。

1998 年,微软公司发布了Visual Studio 6.0。所有开发语言的开发环境版本均升至 6.0。这也是Visual Basic 最后一次发布,从下一个版本 (7.0) 开始,Microsoft Basic 进化成了一种新的面向对象的语言:Microsoft Basic. NET。由于微软公司对于Sun公司Java语言扩充导致与 Java虚拟机不兼容而被Sun告上法庭,微软在后续的Visual Studio中不再包括面向 Java 虚拟机的开发环境。

2002年,随着.NET口号的提出与Windows XP/Office XP 的发布,微软发布了Visual Studio .NET(内部版本号为 7.0)。在这个版本的 Visual Studio 中,微软剥离了Visual FoxPro 作为一个单独的开发环境以 Visual FoxPro 7.0 单独销售,同时取消了Visual InterDev。与此同时,微软引入了建立在 .NET框架上(版本1.0)的托管代码机制以及一门新的语言C#。C#是一门建立在C++和Java基础上的现代语言,是编写 .NET 框架的语言。

2003年,微软对Visual Studio 2002 进行了部分修订,以Visual Studio 2003的名义发布(内部版本号为7.1)。Visio作为使用统一建模语言(UML)架构应用程序框架的程序被引入,同时被引入的还包括移动设

-3-

备支持和企业模版。.NET框架也升级到了1.1。

2005年,微软发布了Visual Studio 2005。.NET字眼从各种语言的名字中被抹去,但是这个版本的Visual Studio仍然还是面向 .NET框架的(版本2.0)。它同时也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。总体来说是一个非常庞大的软件,甚至包含代码测试功能。

2007年11月,微软发布了Visual Studio 2008。

2010年4月12,微软发布了Visual Studio 2010以及.NET Framework 4.0。

2012年9月12日,微软在西雅图发布Visual Studio 2012。 2013年11月13日,微软发布Visual Studio 2013。 2014年11月,微软发布Visual Studio 2015。

目前有五个版本:专业版、高级版、旗舰版、学习版和测试版。

1.6进程与线程简介

1.6.1进程简介

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。另一个是地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。

进程是一个动态的执行过程,它动态地被创建,并被调度执行后消亡。进程是资源分配的基本单位,也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。

系统中需要有描述进程存在和能够反应其变化的物理实体,即进程的静态描述。进程的静态描述由三部份组成:进程控件块PCB,有关程序段和该程序段对其进行操作的数据结构集。进程控制块包含了有关进程的描述信息、控制信息以及资源信息,是进程动态特征的集中反应。系统根据PCB感知进程的存在和通过PCB中所包含的各项变量的变化,掌握进程所处的状态以及达到控制进程活动的目的。由于进程的PCB是系统感知进程的唯一实体,因此,在几乎所有的多道操作系统中,一个进程的PCB结构都是全部或部分常驻内存的。

进程的程序部分描述进程所要完成的功能。而数据结构集是程序在

-4-

执行时必不可少的工作区和操作对象。这两部分是进程完成所需功能的物质基础。由于进程的这两部分内容与控制进程的执行及完成进程功能直接有关,因而,在大部分多道操作系统中,这两部分内容存放在外存中,直到该进程执行时再调入内存。

一个进程的生命周期可以划分为一组状态,这些状态描述了整个进程。系统根据PCB结构中的状态值控制进程。

在进程的整个生命周期内,一个进程至少具有三种基本状态,它们是:执行状态、等待状态和就绪状态。这三种状态之间可以相互换,处于就绪状态的进程已经得到除CPU之外的其它资源,只要由调度得到处理机,便可立即投入执行。处于执行状态的进程因时间片到而放弃处理机进入就绪状态,因等待某个事件发生而放弃处理机进入等待状态。处于等待状态的进程因等待的事件发生而被唤醒进入就绪状态,如图1-1。

图1-1 进程状态转换

1.6.2线程简介

线程是一个进程内的基本调度单位,它既可以由操作系统内核控制,也可由用户程序控制。

线程是由两个部分组成的:一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。

线程只由相关的堆栈(系统栈或用户栈)、寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其它线程的相关变量。

线程也有三个基本状态:执行状态、就绪状态和阻塞状态。针对线程的三种基本状态,存在五种基本操作来转换线程的状态。这五种基本操作是:

-5-

1、派生:线程在进程内派生出来,它既可由进程派生,也可由线程派生。

2、阻塞:如果一个线程在执行过程中需要等待某个事件发生,则被阻塞。

3、激活:如果阻塞线程的事件发生,则该线程被激活并进入就绪队列。

4、调度:选择一个就绪线程进入执行状态。

5、结束:如果一个线程执行结束,它的寄存器上下文以及堆栈内容等将被释放。

1.6.3进程与线程的关系

进程是不活泼的。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,该线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可能包含若干个线程,所有这些线程都“同时”执行进程地址空间中的代码。

线程与资源分配无关,它属于某一个进程,并与进程内的其它线程一起共享进程的资源。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。每个进程至少拥有一个线程,来执行进程的地址空间中的代码。如果没有线程来执行进程的地址空间中的代码,那么进程就没有存在的理由了,系统就将自动撤消该进程和它的地址空间。

若要使所有这些线程都能运行,操作系统就要为每个线程安排一定的CPU时间。它通过以一种循环方式为线程提供时间片(称为量程),造成一种假象,仿佛所有线程都是同时运行的一样。

1.6.4 Windows自带的任务管理器分析

Windows任务管理器由性能、进程、应用程序三大部分组成。其实这三大部分是有机的联系在一起的,尤其是性能和进程,性能中除了CPU使用率以外,其余的数据都是由进程模块顺便取得的。

Windows的任务管理器通过NtQuerySystemInformation的调用来获取各类信息,如CPU使用率,内存使用率,句柄总数,线程总数,进程总数等等。在任务管理器中的几乎所有信息都是来自该函数。NtQuerySystemInformation函数隶属Ntdll.dll,是一个未公开的函数。其调用方式为:

-6-

NTSTATUS NtQuery System Information ( SYSTEM _ INFORMATION _ CLASS

SystemInformationClass,PVOID SystemInformation,

ULONG SystemInformationLength,PULONG ReturnLength); SystemInformationClass:在SYSTEM_INFORMATION_CLASS中的枚举值之一,回信息的种类;

SystemInformation:指到一个要求返回信息的缓冲区,这个系统信息变量的尺寸和结构依赖于SystemInformationClass参数的值;

SystemInformationLength:SystemInformation参数指定的缓冲区尺寸;

ReturnLength:返回值尺寸。

-7-

第二章 主要功能及设计思路

2.1 主要功能

设计要求实现的主要功能进程管理功能,具体包括以下内容: (1)任务管理:列出所有当前运行的窗口程序名、运行状态等信息;和对它们进行终止操作。

(2)进程管理:列出所有的Windows进程,以及进程所在的磁盘绝对路径,进程消耗资源状况等;除核心进程外,所有的其他进程均可以被终止,。

(3)系统性能显示:绘制CPU、内存使用率图,以描述系统性能;列出物理内存;显示系统当前信息。

2.2 设计思路

在VisualStudio2010环境设计一个基于对话框的应用程序,类似于Windows自带的任务管理器,主窗口上添加一个标签控件,加入三个页面,分别是:任务、进程和系统性能信息。

其中,任务页面显示当前正在运行的任务,用列表控件进行显示,并能够对任务进行操作,如:添加新任务,结束任务,切换任务等。

进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控件进行显示,并能够实行终止进程、进程列表保存到文件等操作。

系统性能页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内存的使用率,并绘制CPU使用率和内存使用率的图形,并用列表控件显示系统当前信息。

第三章 主要功能实现

3.1主框架的实现

所设计的程序是基于对话框的程序。首先创建一个C#的Windows窗

-8-

体应用程序, 在主对话框类中添加一个TabContro标签控件用于放置应用程序、进程和性能三个页面,如图3-1。

图3-1 标签控件

3.1.1 子对话框的显示

子对话框的显示与切换,是通过标签控件完成的。当用户点击标签控件上的每一项时,分别显示对应页面的相关信息。

要显示三个子对话框,需要添加三个对话框到工程中,并将Style属性设为Child,Board设为None,取消标题栏。再分别创建三个对话框的类CTask ,CProcess,CChart,并定义这三个类的变量:

CTask m_Task; //任务 CProcess m_Process; //进程 CChart m_Chart; //图表

并定义一个图像列表变量用于存放标签图标:CImageList m_ImageList;

接下来就创建子窗口:

m_Task.Create(IDD_TASK,m_Tab.GetActiveWindow()); m_Process.Create(IDD_PROCESS,m_Tab.GetActiveWindow()); m_Chart.Create(IDD_CHART,m_Tab.GetActiveWindow());

当用户选择标签中的一项是,为了将对应的对话框在标签控件中显示出来,需要在OnShowWindow(BOOL bShow,UINT nStatus)中添加代码相关代码。这样便可将在个对话框分别显示于标签控件的每个页面中,但要实现选择标签的不同项显示不同页面还需在OnSelchangeMaintab(NMHDR* 添加显示代码。

void CPcsMgrDlg :: OnSelchange Maintab ( NMHDR * pNMHDR,

-9-

pNMHDR,LRESULT* pResult)和

OnSelchangingMaintab(NMHDR* pNMHDR,LRESULT* pResult)两函数中

LRESULT * pResult )

{ switch(m_Tab.GetCurSel())

{

case 0:m_Task.ShowWindow(SW_SHOW);//任务页面被选中,则显示任务页面

m_Task.CenterWindow(); break;

case 1:m_Process.ShowWindow(SW_SHOW); //任务页面被选中,则显示进程页面

m_Process.CenterWindow(); break;

case 2:m_Chart.ShowWindow(SW_SHOW); //任务页面被选中,则显示系统信息页面

} }

m_Chart.CenterWindow(); break;

3.1.2提升程序的权限

为了能够终止所有进程,需要提升本进程的权限: 1、先调用GetCurrentProcess函数取得当前进程的句柄; 2、然后调用OpenProcessToken打开当前进程的访问令牌;

3、接着调用LookupPrivilegeValue函数取得你想提升的权限的值; 4、最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限。

相关代码是在CPcsMgrApp类的InitInstance()函数中添加。

3.2列表页面设计

该类实现当前系统运行任务(有可见窗口的程序)的管理,如查看当前任务,添加新任务,结束任务,切换任务等。

3.2.1显示任务信息

任务信息包括窗口中可见程序的程序名、路径、等信息,将在任务列表页面中添加一个列表控件,用于将任务信息显示出来,如图3-2。

-10-

图3-2 任务列表

要显示桌面窗口中的任务信息,首先要一个结构体类型用于存放任务的相关信息:

typedef struct {

CString strTaskName; //窗口标题 DWORD dwProcessID; //进程ID DWORD dwThreadID; //线程ID CString strRunState; //运行状态 DWORD dwWndHandle; //窗口句柄 }TASK_IFNO,*PTASK_INFO;

获取窗口标题,使用API标准函数GetWindowText (): char temp[MAX_PATH];

GetWindowText(hwnd,temp,sizeof(temp)) 获取进程及线程ID:

TID=GetWindowThreadProcessId(hwnd,&PID);

确定运行状态是利用SendMessageTimeout向窗口发送消息而取得: if(SendMessageTimeout(hwnd,WM_SYSCOMMAND,NULL,NULL,SMTO_ABORTIFHUNG,1000,NULL))

strRunState = \正在运行\else

-11-

strRunState = \没有响应\然后添加任务信息到数组: TASK_IFNO ti; ti.strTaskName = temp; ti.dwProcessID = PID; ti.dwThreadID = TID;

ti.dwWndHandle = (DWORD)hwnd; ti.strRunState = strRunState;

pTaskThis->m_TaskInfoArray.Add(ti);

最后把任务信息的每一行在任务列表中显示出来: for(int i=0;i

m_task.InsertItem(i,ti.strTaskName,i);//任务名 str.Format(\ m_task.SetItemText(i,1,str);//进程ID str.Format(\ m_task.SetItemText(i,2,str);//线程ID

m_task.SetItemText(i,3,ti.strRunState);//运行状态

3.3进程列表页面设计

该页面主要实现显示当前系统正在运行的所有进程并对其进程管理,如结束进程,显示进程模块信息,显示进程线程信息。如图3-3。

-12-

图3-3 进程列表页面

3.3.1显示进程信息

进程信息包括进程名、进程ID、CPU使用率、内存使用率、优先级、线程数、父进程ID和进程路径等,如图3-4。

-13-

图3-4 进程信息

通过调用ToolHelp API函数可枚举所有运行的进程并取得进程路径,进程ID,父进程ID,线程数和优先级。要使用该类接口函数需要包含头文件tlhelp32.h。主要用到ToolHelp API中的以下几个函数:

hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);该函数用于创建一个系统进程快照,取得系统中的所有进程的信息。

Process32First(hProcessSnap,&pe32);该函数取得快照中第一个进程信息,pe32参数是一个PROCESSENTRY32结构类型,该函数将取得的进程信息填充到pe32中。PROCESSENTRY32的定义如下:

typedef struct tagPROCESSENTRY32{ DWORD dwSize;//结构大小 DWORD cntUsage;

DWORD th32ProcessID;//进程ID ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads;//线程计数

DWORD th32ParentProcessID;//父进程ID LONG pcPriClassBase;//优先级

-14-

DWORD dwFlags;

TCHAR szExeFile[MAX_PATH];//进程路径

}PROCESSENTRY32,然后从该结构中解析出所需的进程名、进程ID、优先级、线程数、父进程ID和进程路径等信息。

BOOL

WINAPI

Process32

Next

(

HANDLE

hSnapshot

,

LPPROCESSENTRY32 lppe );该函数取得快照中下一个进程信息,参数同Process32First函数。

进程基本信息的获取过程如图3-5。

图 3-5 获取进程信息

进程CPU使用率是使用Windows NT以上系统提供的性能监视器取得。Windows性能监视器所用的编程接口是以性能数据助手库(PDH.dll)及一系列 C/C++头文件(即pdh.h、pdhmsg.h和winperf.h,它们是操作系统附带的)的形式公开给用户的。部分主要代码如下:

PDH_STATUS pdhStatus;

PDH_FMT_COUNTERVALUE fmtValue;

pdhStatus = PdhCollectQueryData(m_hQuery);//收集数据 pdhStatus = PdhGetFormattedCounterValue(

hCounter,PDH_FMT_LONG,&dwctrType,&fmtValue);//得到格式化数据,fmtValue即是我们需要得到的CPU使用率数据。

-15-

3.3.2结束进程

进程只是提供了一段地址空间和内核对象,其运行是通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常推出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。ExitProcess()函数即可在进程中的某个线程中使用,并将立即终止本进程的运行。ExitProcess()函数原型为:

VOID ExitProcess(UINT uExitCode);其参数uExitCode为进程设置了退出代码。该函数具有强制性,在执行完毕后进程即已经被结束,因此位于其后的任何代码将不能被执行。虽然ExitProcess()函数可以在结束进程的同时通知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得ExitProcess()函数在使用上将存在有安全隐患。例如,如果在程序调用ExitProcess()函数之前曾用new操作符申请过一段内存,那么将会由于ExitProcess()函数的强制性而无法通过delete操作符将其释放,从而造成内存泄漏。有鉴于ExitProcess()函数的强制性和不安全性,在使用时一定要引起注意。

ExitProcess()只能强制执行本进程的退出,如果要在一个进程中强制结束其他的进程就要用TerminateProcess()来实现。与ExitProcess()不同,TerminateProcess()函数执行后,被终止的进程是不会得到任何关于程序退出的通知的。也就是说,被终止的进程是无法在结束运行前进行退出前的收尾工作的。所以,通常只有在其他任何方法都无法迫使进程退出时才会考虑使用TerminateProcess()去强制结束进程的。下面给出TerminateProcess()的函数原型:

BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode);参数hProcess和uExitCode分别为进程句柄和退出代码。第二个参数uExitCode,当它为0时,在调用TerminateProcess()杀死进程后,Windows又将自动唤醒该进程;当它为1时,杀死进程后,Windows不会再唤醒该进程。

本程序中的结束进程,是指强制结束其他应用程序运行的进程,应采用TerminateProcess()强制结束。要终止进程先要用OpenProcess函数将进程打开,然后用TerminateProcess函数结束进程。

HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE, m_dwProcessID.GetAt(m_iCurSel));

-16-

图4-3 资源使用情况对比图

-27-

结论

课题研究设计的进程管理器能够显示任务信息,显示进程、线程模块等信息,能够结束任务、终止进程,并能以图表的形式显示CPU、内存使用率,操作简单,能基本满足用户对Windows进程管理的需求。

通过课题的研究,得出一个重要结论:在VC环境进行Windows系统编程,不仅需要熟悉VC编程环境,还需要熟悉和利用系统提供给我们的许多编程接口,即API编程,这样能大大地提高编程效率。在课题的设计过程中,任务信息、进程信息和系统资源使用情况都是利用API函数而取得的。通过课题的设计,巩固了以前所学的基本知识,更学到了软件设计的基本方法、技巧和流程,这对以后的学习工作有很大的帮助。

-28-

参考文献

[1] Karli Watso. C#入门经典. 第五版. 北京: 清华大学出版社, 2010 [2] 李乃文. C# 2008程序设计实践教程. 北京: 清华大学出版社, 2009 [3] 李增民. C#程序开发全程演练. 北京: 清华大学出版社, 2009

[4] 明日科技. C#项目开发案例全程实录. 第二版. 北京: 清华大学出版社, 2010 [5] 陈佛敏. C#程序设计简明教程. 北京: 人民邮电出版社, 2008 [6] 金华. C#网络编程技术教程. 北京: 人民邮电出版社, 2008 [7] 郑千忠. C#编程网络大讲堂. 北京: 清华大学出版社, 2008 [8] 马骏. C#网络应用高级编程. 北京: 人民邮电出版社, 2006

[9] (美)Jeffrey Richter. Windows核心编程[M].北京:机械工业出版社,2005

[10] 汤子瀛,哲风屏,汤小丹. 计算机操作系统[M].西安:西安电子科大出版社,2005

-29-

致 谢

逝者如斯夫,不舍昼夜。离校之期已日趋渐进,毕业论文的完成也以进入了尾声。从开始的论文选题到论文的完成,一直都离不开老师对我的帮助,在这里请接受我诚挚的谢意!在此我向所学专业的所有老师表示衷心的感谢,谢谢你们两年半的辛勤栽培,谢谢两年半里面你们孜孜不倦的教诲!三年来,我所收获的不仅仅是愈加丰厚的知识,更重要的是在操作、实践中所培养的思维方式、表达能力和广阔视野。庆幸这三年来我遇到的良师益友,让我在一个安好的环境中度过三年的大学生活。感恩之情难以用言语量度,谨以最朴实的话语致以最崇高的敬意。

特别感谢的是指导老师郑治武,老师精深的学术造诣和严谨的治学态度。指导老师在完成整个毕业论文的过程中,给予我悉心的指导和帮助。老师的严谨的治学态度、勤奋的工作作风、平易近人的处世风范,给我留下了深刻的印象。值此论文完稿之际,特此向老师致以衷心的感谢!感谢湖南软件学院给我学习的机会,感谢两年来陪伴我的老师和同学。

最后,在论文完成过程中,本人还得到了李锦华同学的热心帮助,本人向他表示深深的谢意。

-30-


Windows任务管理器的设计与实现.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:人教版数学七年级上 新课标与核心素养期末多层级高效培优测试卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: