您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C#网络编程(整理版)PPT课件第02章-进程与线程
1第2章进程与线程2.1进程与线程的基本概念2.2进程管理(Process类)2.3线程管理(Thread类)2.4线程同步与线程池2.5BackgroundWorker组件2本章重点本章教学目的通过对进程、线程基本知识以及BackGroundWork组件的介绍,使学生对相关内容有一个感性认识。本章教学要求(1)掌握进程查看、启动、停止的基本方法;(2)掌握线程创建、启动、终止的基本方法;(3)掌握开辟多线程的基本方法;(4)掌握在一个线程中引用其他线程中的控件的方法;(5)了解其他内容。32.1进程与线程的基本概念进程正在执行的程序称为进程。与进程相关的信息包括:进程标示(进程ID)、文件名、执行的程序和数据,运行时间、在存储器中的位置、占用的内存容量等。线程将一个进程划分为若干个独立的执行流,每一个执行流均称为一个线程。(1)线程是CPU调度和分配的基本单位。(2)每个进程都有一个主线程。(3)除了主线程以外,还可以给一个进程分配若干个子线程,从而达到多个任务并行执行的目的。42.2进程管理(Process类)1、Process类位于System.Diagnostics命名空间下。2、对本机(也叫本地计算机)(1)可以启动、终止某个进程(2)可以查看进程相关信息,如CPU利用率等(3)可以查看进程工作状态3、对远程计算机(1)可以查看远程计算机相关信息(2)无法直接启动、终止远程计算机4、在一个程序中处理其他的程序(例如调用其他.exe文件、快捷方式等),实际上就是对进程进行管理。52.2进程管理(Process类)Process类提供的静态方法62.2进程管理(Process类)5、Process类常用的属性和方法-----------------------获取进程实例-------------------GetProcessById方法(静态方法):通过进程Id创建新的Process组件,并将其与本地计算机上的进程资源关联。GetProcessById最多只有一个Process实例。GetProcesses方法(静态方法):获取本机所有进程GetProcessesByName方法(静态方法):获取本机上特定名称的进程-----------------------获取及设置优先级---------------BasePriority属性:获取进程优先级(只读)PriorityClass属性:设置或更改进程优先级72.2进程管理(Process类)---------------------------进程ID及进程名-----------------------Id属性:获取关联进程的唯一标识符ProcessName属性:获取该进程的名称,不包括路径和扩展名---------------------------进程其他信息-------------------------MachineName属性:获取关联进程正在其上运行的计算机名称MainModule属性:获取关联进程的主模块Modules属性:获取由关联进程加载的模块TotalProcessorTime属性:获取进程的总的处理器时间StartTime属性:获取关联进程的启动时间WorkingSet64属性:为进程分配的物理内存量(字节数)81.2Process类-----------------------进程启动-------------------------Start方法:启动进程资源并将其与Process组件关联StartInfo属性:获取或设置要传递给启动进程的文件名以及启动参数-----------------------进程终止-------------------------Kill方法:强制终止进程CloseMainWindow方法:关闭具有用户界面的进程Close方法:释放与此组件关联的所有资源HasExited属性:指示关联进程是否已终止WaitForExit方法:设置等待关联进程退出的时间,并在该段时间结束前或该进程退出前,阻止当前线程执行。92.2.1获取进程信息1、如何获取进程信息(1)获取本地计算机的所有进程:Process[]myProcesses=Process.GetProcesses();(2)获取本地计算机上指定名称的进程:Process[]myProcesses=Process.GetProcessesByName(进程名称);注意:(a)进程名称不带扩展名。(b)可以是任何一个可执行文件例如:Process[]myProcesses=Process.GetProcessesByName(“WindowApplication1);102.2.1获取进程信息(续)(3)获取远程计算机的所有进程:Process[]myProcesses=Process.GetProcesses(remoteMachineName);例如:Process[]myProcesses=Process.GetProcesses(192.168.0.1);(4)获取远程计算机上指定名称的进程:Process[]myProcesses=Process.GetProcessesByName(远程进程名称,remoteMachineName);11程序举例【例2-1】【例2-1】观察本机运行的所有进程,并显示进程相关的信息。要求:(1)用DataGridView显示所有进程信息(2)鼠标单击DataGridView某处时,判断单击的是否为行开头或者某个单元格,如果是,显示该行进程的详细信息(运行效果见下页图)121.2.1获取进程信息(续)运行效果(ProcessMonitor):132.2.2启动和停止进程1.启动进程:方法1:(1)创建一个Process组件的实例,例如:ProcessmyProcess=newProcess();(2)设置其对应的StartInfo属性,指定要运行的应用程序名以及传递的参数:myProcess.StartInfo.FileName=文件名;process1.StartInfo.Arguments=参数;如果该进程带有图形用户界面,也可以指定图形用户界面的打开方式。例如:myProcess.StartInfo.WindowStyle=ProcessWindowStyle.Normal;(3)调用该实例的Start方法启动该进程。方法2:直接调用Process类提供的静态方法启动进程。142.2.2启动和停止进程(续)2.停止进程通过两种方法利用Process组件停止进程。(1)如果进程有图形用户界面,调用CloseMainWindow方法。(2)如果进程没有用户界面,调用进程的Kill方法。不论有没有图形用户界面,如果希望强行让其退出,在权限允许的情况下,均可以调用Kill方法终止该进程。15程序举例【例2-2】【例2-2】启动、停止和观察Notepad进程。(StartStopProcess)要求:(1)用ListView显示“记事本”进程信息。(2)用Process类提供的静态方法启动进程。(3)终止进程时,把所有“记事本”进程全部终止。16项目中的应用:在程序中执行sql文件说明:osql.exe是SQLServer提供的一个工具,可以利用该工具添加、删除数据库用户,修改用户登录密码,附加、分离数据库等。对于通过程序管理数据库很有用。publicvoidExecuteSqlFile(stringstrFileName){ProcessSqlProcess=newProcess();SqlProcess.StartInfo.FileName=osql.exe;SqlProcess.StartInfo.Arguments=-Usa-Psa123-dmydb-i+strFileName;SqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;SqlProcess.Start();SqlProcess.WaitForExit();SqlProcess.Close();}172.3线程管理(Thread类)2.3.1前台线程与后台线程2.3.2线程基本操作2.3.3Volatile关键字2.3.4在一个线程中操作另一个线程的控件182.3线程管理(Thread类)Thread类位于System.Threading命名空间下。Thread类是用于创建和控制线程的,对线程的常用操作有:启动线程、终止线程、合并线程和让线程休眠等。Thread类提供的常用属性1.IsAlive属性:获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止,则为true;否则为false2.IsBackground属性:获取或设置一个值,该值指示某个线程是否为后台线程。是后台线程或即将成为后台线程,则为true;否则为false3.Priority属性:获取或设置一个值,该值指示线程的调度优先级192.3线程管理(Thread类)(续)Thread类提供的常用方法1.Start方法:启动线程2.Join方法:将指定的线程合并到当前线程中,并阻止当前线程执行,直到指定的线程终止或经过了指定的时间为止3.Sleep方法:将当前线程阻止指定的毫秒数,零(0)表示应挂起此线程以使其他等待线程能够执行4.Abort方法:在调用此方法的线程上引发ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程202.3.1前台线程与后台线程1.一个线程要么是后台线程要么是前台线程。2.后台线程与前台线程类似,区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共语言运行库就会结束该进程,而且所有属于该进程的后台线程也都会立即停止,而不管后台工作是否完成。3.利用Thread对象的IsBackground属性,可以设置或判断一个线程是后台线程还是前台线程。4.通过将某个线程的IsBackground属性设置为true,使其变为后台线程。5.默认情况下,属于托管线程池的线程(即其IsThreadPoolThread属性为true的线程)都是后台线程,通过创建并启动新的Thread对象而生成的线程都是前台线程。212.3.2线程的基本操作1.启动线程启动线程前,首先要创建一个线程。创建无参数线程的一般形式为:Threadt1=newThread(线程名);创建带参数线程的一般形式为(传递一个Object类型的参数):Threadt2=newThread(线程名(Objectobj));对于不止一个参数的情况,可以先将这些参数封装到一个类中,然后传递该类的实例,在线程中,再通过该实例访问相应的数据,从而达到启动线程时传递多个参数的目的。创建线程实例后,就可以调用Start方法启动线程了。例如:t1.Start();//不带参数t2.Start(“myClass”);//带参数注意:调用Start只是告诉系统启动该线程,但是系统并不一定会立即启动它。222.3.2线程的基本操作2.终止线程两种方法:1.事先设置一个布尔字段,在其他线程中通过修改该布尔量的值作为传递给该线程是否需要终止的判断条件,而在该线程中循环判断该布尔值,以确定是否退出线程,这是结束线程比较好的方法,实际应用中一般使用这种方法。2.调用Thread类的Abort方法,该方法的最终效果是强行终止线程。232.3.2线程的基本操作3.暂停线程在多线程应用程序中,有时候并不希望某一个线程继续执行,而是希望该线程暂停一段时间,这样,CPU就会将其时间片中剩余的部分让给另一个线程。调用Thread类的Sleep方法可以实现这个功能。例如:Thread.Sleep(1000);这条语句的功能是让当前线程暂停1000毫秒。注意Sleep方法是静态方法,暂停的是该语句所在的线程,而不是其他线程。242.3
本文标题:C#网络编程(整理版)PPT课件第02章-进程与线程
链接地址:https://www.777doc.com/doc-1277098 .html