《2012-2013第七章PPT》由会员分享,可在线阅读,更多相关《2012-2013第七章PPT(67页珍藏版)》请在金锄头文库上搜索。
1、第七章,多线程开发技术,2,学习目标,掌握进程和线程概念;掌握进程的创建与信息获取方法;掌握线程创建、同步、通信等基本操作。,3,第七章 多线程开发技术,7.1 进程线程基本概述7.2 进程开发技术7.3 线程开发开发技术7.4 多线程案例分析,4,7.1 进程线程基本概述,7.1.1 进程基本概念7.1.2 线程基本概念,5,7.1.1 进程基本概念,进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量
2、和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。,6,7.1.2 线程基本概念,线程(thread),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
3、一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。,7,线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通
4、常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。,return,8,7.2 进程开发技术,7.2.1 进程管理7.2.2 进程创建与关闭7.2.3 获取进程信息,9,7.2.1 进程管理,一个应用程序执行时调用其他的应用程序,实际上就是对进程管理在System.Diagno stics命名空间下,有一个Process类用于完成于进程相关
5、的处理任务。,10,Process类常用属性,11,Process类常用属性,12,Process类常用属性,13,rocess类常用方法,14,rocess类常用方法,15,rocess类常用方法,16,7.2.2 进程创建与关闭,启动与停止指定的进程之前,需要创建一个进程实例,并设置相应的进程的StartInfo属性,以指定欲运行的应用程序名称及相应的参数然后调用Start方法启动该进程调用CloseMainWindow或Kill方法停止该进程。Kill立即关闭进程waitforExit 在等待关联进程的退出Close 释放与此关联的所有进程。,17,创建进程,格式如下:,Process
6、myProcess = new Process();myProcess.StartInfo.FileName= 启动的文件名;myProcess.StartInfo.Arguments = 参数;,也可以用ProcessStartInfo类对象,并通过构造函数指定属性和参数,然后传递给进程对象的StartInfo属性。格式如下:,Process myProcess = new Process();ProcessStartInfo ps = new ProcessStartInfo(文件名);ie.StartInfo = ps;,18,实例,using System;using System.C
7、ollections.Generic;using System.Linq;using System.Text;using System.Diagnostics;namespace _6_2 class Program public static void Main() Process ie = new Process();/指定启动程序的名称ie.StartInfo.FileName= iexplore.exe;ie.StartInfo.Arguments = ; if(ie.Start() Console.WriteLine(网站已经顺利创建并启动); /强制关闭刚刚启动的程序 ie.Kil
8、l(); Console.WriteLine(刚刚创建的网站关闭); Console.ReadLine(); ,19,7.2.3 获取进程信息,System.Diagnostics.Process.GetProcesses()方法可以获取一个进程,常用的获取进程的方法有4种:(1)获得当前计算机系统内所有的已启动的进程:,1. 进程获取,Process processOnComputer= Process.GetProcesses();例如:public static void Main() /获得当前计算机系统内所有的已启动的进程,方法为: Process processOnComputer
9、 = Process.GetProcesses(); foreach (Process p in processOnComputer) System.Console.WriteLine(p.ToString(); Console.ReadLine();,20,(2)获取本地计算机上制定名称的进程,方法为:Process myProcess = Process.GetProcessesByName(“进程名称”);例如:Process myProcess = Process.GetProcessesByName(http:/ myProcess = Process.GetProcesses(远程
10、计算机名或IP地址);例如:Process myProcess = Process.GetProcesses(192.168.0.2);(4)获取远程计算机上制定名称的进程,方法为:Process myProcess = Process.GetProcessesByName(processName,machineName);其中processName为不包括扩展名或路径的进程名,serverName为远程机器名称或IP地址,例如:Process myProcess = Process.GetProcessesByName(,wwh);,21,2. 获取进程信息,可使用该组件来获取有关当前运行的
11、进程的信息。信息包括线程集加载的模块(.dll 和.exe 文件)性能信息(如进程当前使用的内存量),22,实例-结果,23,实例-设置界面,24,实例-Load事件,private void Form1_Load(object sender, EventArgs e) listView1.FullRowSelect = true; GetProcess();,25,实例-GetProcess()方法及程序,private void GetProcess() Process proList = Process.GetProcesses(.);/获得本机的进程 lblNum.Text = pro
12、List.Length.ToString(); /当前进程数量 foreach (Process p in proList) ListViewItem lvi = new ListViewItem(); lvi.Text = p.ProcessName; lvi.SubItems.AddRange(new string p.Id.ToString(), p.PrivateMemorySize64.ToString() ); /进程ID 使用内存 listView1.Items.Add(lvi); ,26,实例-终止事件,private void btnKill_Click(object sen
13、der, EventArgs e) if (listView1.SelectedItems.Count 0) try string proName = listView1.SelectedItems0.Text;/根据进程命获得指定的进程 Process p = Process.GetProcessesByName(proName); p0.Kill(); /杀死该进程 MessageBox.Show(进程关闭成功!); GetProcess(); catch MessageBox.Show(无法关闭此进程!); else MessageBox.Show(请选择要终止的进程!); ,27,实例
14、-启动进程事件,private void btnStart_Click(object sender, EventArgs e) if (lblNum.Text != string.Empty) Process.Start(lblNum.Text); /启动一个进程 else lblNum.Focus(); ,return,28,7.3 线程开发开发技术,7.3.1 线程开发7.3.2 线程同步7.3.3 线程通信7.3.4 线程池,29,7.3.1 线程开发,NET通过System.Threading命名空间下的类来抽象线程。其中最重要的就是类Thread,Thread类抽象了线程,它的一个对
15、象就代表了一个线程。当创建了一个Thread对象时,这个线程并没有开始执行,而是处于非执行的状态,当调用了Thread对象的Start()方法就表明线程可以开始执行了,但是线程并不一定马上就执行了。多线程程序的一个最大的特征就是不确定性,在很多时候只能预测大概的执行时间和顺序,但是实际的执行时机只有操作系统才会知道。当Start()了的Thread对象在被系统告知可以执行了后,就等待操作系统开始执行这个线程所包含的执行序列。如果没有特殊情况发生,它将会执行到时间片用完或者代码在时间片用完前就执行完了。这个时候线程就会转移到非执行状态或者转到结束状态,从而等待被销毁。如果在执行的过程中遇到特殊情况,可以随时将线程转为非执行的状态或者直接结束。这个过程可以是主动的也可以是被动的。如果是主动的话,线程只有在执行的状态下才能将自己的状态转移到非执行或者结束。如果是被动的话,只有在非执行的时候可以被被正在执行的线程把状态转为可执行或者被结束掉。,