1 Process ExampleWindows 2 Process 3 using System




![private void button. Stop_Click(object sender, Event. Args e) { //创建新的Process组件的数组, 并将它们与指定的进程名称( Notepad)的所有进程资源相关联. Process[] myprocesses; private void button. Stop_Click(object sender, Event. Args e) { //创建新的Process组件的数组, 并将它们与指定的进程名称( Notepad)的所有进程资源相关联. Process[] myprocesses;](https://slidetodoc.com/presentation_image_h2/2e7348daf1646a08b6f1c081700fc2f6/image-5.jpg)
![Process[] processes; processes = Process. Get. Processes(); foreach (Process p in processes) { //由于访问Idle的Start. Process[] processes; processes = Process. Get. Processes(); foreach (Process p in processes) { //由于访问Idle的Start.](https://slidetodoc.com/presentation_image_h2/2e7348daf1646a08b6f1c081700fc2f6/image-6.jpg)





































- Slides: 43
例. 启动、停止和观察进程 1. 新建一个名为Process. Example的Windows应用程序。 2. 从 具箱中将Process组件拖放到设计窗体。 3. 添加名称空间 : using System. Diagnostics; using System. Threading; 4. 添加“启动记事本”、“停止记事本”和“观察所有进程”三个按 钮,并添加Click事件代码: private void button. Start_Click(object sender, Event. Args e) { process 1. Start. Info. File. Name = "notepad. exe"; //启动Notepad. exe进程. process 1. Start(); } 4
private void button. Stop_Click(object sender, Event. Args e) { //创建新的Process组件的数组, 并将它们与指定的进程名称( Notepad)的所有进程资源相关联. Process[] myprocesses; myprocesses = Process. Get. Processes. By. Name("Notepad"); foreach (Process instance in myprocesses) { //设置终止当前线程前等待1000毫秒 instance. Wait. For. Exit(1000); instance. Close. Main. Window(); } } private void button. View_Click(object sender, Event. Args e) { list. Box 1. Items. Clear(); //创建Process类型的数组, 并将它们与系统内所有进程相关联 5
Process[] processes; processes = Process. Get. Processes(); foreach (Process p in processes) { //由于访问Idle的Start. Time会出现异常,所以将 其排除在外 if (p. Process. Name != "Idle") { //将每个进程名和进程开始时间加入list. Box 1中 this. list. Box 1. Items. Add( string. Format("{0, -30}{1: h: m: s}", p. Process. Name, p. Start. Time)); } } } 6
超级链接到微软网站 : System. Diagnostics. Process. Start("http: //www. micosoft. com. cn" 打开一个窗口,列出C盘根目录下的文件及文 件夹 : System. Diagnostics. Process. Start("C: /"); 7
delegate void d. Fun(string text); d. Fun 1; //d. Fun类变量 private Thread thread; //线程类变量 4. 为标题为“新线程”的按钮(button 1)增加单击事 件处理函数如下: private void button 1_Click(object sender, Event. Args e) { thread=new Thread(new Thread. Start(fun)); label 1. Text="0"; //运行时间从0开始 thread. Start(); button 1. Enabled=false; button 2. Enabled=true; } 13
14 5. 为标题为“撤销”的按钮(button 2)增加单击事件处 理函数如下: private void button 2_Click(object sender, Event. Args e) { if(thread. Is. Alive) { thread. Abort(); //撤销线程对象 button 1. Enabled=true; button 2. Enabled=false; } }
16 public void fun() { while(true)//退出该方法,线程结束 { int x=Convert. To. Int 32(label 1. Text); x++; string s=Convert. To. String(x); label 1. Invoke(d. Fun 1, new object[]{s}); Thread. Sleep(1000); //� 程休眠 1秒� } } 7. 为Form 1类定义一个修改label 1. Text的方法如下:
20
delegate void d. Fun(Progress. Bar p); d. Fun 1; //Fun类变量 private Thread thread 1; //线程类变量 private Thread thread 2; Fargs Frags 1; //结构变量 • 为Form 1类定义一个线程方法如下(注意只能有一个object 类参数): public void fun(object data) { Fargs Frags 2 = (Fargs)data; Progress. Bar p 1 = Frags 2. PB; int Sleep. Time = Frags 2. Sleep. T; while (p 1. Value <100) { p 1. Invoke(d. Fun 1, new object[] { p 1 }); Thread. Sleep(Sleep. Time); } } 5. 为Form 1类定义一个修改进度条的属性Value的方法如下: 22
private void Set. Value(Progress. Bar p 2) { p 2. Value += 1; } 6. 在Form 1类的Load事件增加事件函数如下(此处代码不能放在 构造函数中): private void Form 1_Load(object sender, Event. Args e) { d. Fun 1 = new d. Fun(Set. Value); thread 1 = new Thread(new Parameterized. Thread. Start(fun)); thread 2 = new Thread(new Parameterized. Thread. Start(fun)); Frags 1. PB = progress. Bar 1; Frags 1. Sleep. T = 100; thread 1. Start(Frags 1); //注意如何为fun方法传递参数 Frags 1. PB = progress. Bar 2; Frags 1. Sleep. T = 200; thread 2. Start(Frags 1); } 23
24 7. 为主窗体的Closing事件增加事件处理函数如下: private void Form 1_Form. Closing(object sender, Form. Closing. Event. Args e) { if(thread 1. Is. Alive) thread 1. Abort(); if(thread 2. Is. Alive) thread 2. Abort(); } 8. 编译,运行,可以看到两个进度条以不同的速度 前进,当进度条被添满,线程停止。
27 7. 2. 1多个线程同时修改共享数据可能发生错误 【例7. 4】下边的例子模拟 2个线程同时修改同一个共享数据时可 能发生的错误。 1. 新建项目。在Form 1. cs头部增加语句: using System. Threading。 2. � Form 1� 定� 2个� 程�� 量:Thread thread 1, thread 2。 定� 整形� 量:int num=0。 3. 在窗体中放置一个�� 和按� 控件,按� 的事件� 理函数如 下: private void button 1_Click(object sender, Event. Args e) { label 1. Text = num. To. String(); } 4. � Form 1� 构造函数增加� 句如下: thread 1= new Thread(new Thread. Start(Fun 1)); thread 2= new Thread(new Thread. Start(Fun 2)); thread 1. Start(); thread 2. Start();
35 public void Fun 2() { int k, n; for(k=0; k<4; k++) { mut. Wait. One(); n=num; n++; Thread. Sleep(10); num=n; mut. Release. Mutex(); Thread. Sleep(100); } } 编译,运行,标签控件显示 8。如果有多个共享数据区, 可以定义多个Mutex类对象。
40 thread 1= new Thread(new Thread. Start(Fun 1)); thread 2= new Thread(new Thread. Start(Fun 2)); thread 1. Start(); thread 2. Start(); 6. 为Form 1类定义Fun 1()和Fun 2()方法如下: public void Fun 1() //生产数据 { for(int k=1; k<5; k++) { x=k; Thread. Sleep(200); } } public void Fun 2() //消费数据 { for(int k=0; k<4; k++) { sum+=x; Thread. Sleep(100); } } 7. 编译运行,单击按钮,标签控件应显示 10,实际运行多次,显 示的数不为 10。
public void Fun 1() //生产数据 { for(int k=1; k<5; k++) {//这里this是Form 1类对象,得到this的对象锁 Monitor. Enter(this); //Monitor. Enter(this)和Monitor. Exit(this)是临界区 if(mark) //如消费者数据未取走,释放对象锁,生产者等待 Monitor. Wait(this); mark=!mark; x=k; Monitor. Pulse(this); //激活消费者线程 Monitor. Exit(this); }//释放this的对象锁} } 42
修改Fun 2()如下: public void Fun 2() //消费数据 { for(int k=0; k<4; k++) { Monitor. Enter(this); if(!mark) Monitor. Wait(this); //如果生产者未放数据,消费者等待 mark=!mark; sum+=x; Monitor. Pulse(this); Monitor. Exit(this); } } 编译,运行,单击按钮,标签控件应显示 10。 43