一、進程
進程是一個具有獨立功能的程序關于某個數據集合的一次運行活動。
它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。
Process 類,用來操作進程。
命名空間:using System.Diagnostics;
1
2
3
|
Process.Start( "calc" ); //打開計算器 Process.Start( "mspaint" ); //打開畫圖 Process.Start( "iexplore" , "http://www.baidu.com" ); //打開瀏覽器并指定地址 |
(一)通過一個進程,打開指定的文件:
1.創建進程對象
1
|
Process p = new Process(); |
2.創建一個StartInfo對象,是指定帶盤符的路徑。
1
|
ProcessStartInfo psi = new ProcessStartInfo(@"C:\user\.....); |
3.進程指定及開始
1
2
|
p.StartInfo = psi; //指定路徑 p.Start(); //開始進程 |
(二)通過文件選擇框讓用戶自己選擇所需要打開的程序并打開:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private void button1_Click( object sender, EventArgs e) { //這是選擇文件的類型 openFileDialog1.Filter = "應用程序|*.exe" ; //顯示對話框并且判斷用戶有沒有選中文件 if (openFileDialog1.ShowDialog() == DialogResult.OK) { //取文件路徑 string path = openFileDialog1.FileName; //創建一個新的進程 Process p = new Process(); //制造進程的啟動信息 ProcessStartInfo psf = new ProcessStartInfo(path); //設置該進程的執行信息 p.StartInfo = psf; //啟動進程 p.Start(); } } |
例子:注銷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//這個path就是你要調用的exe程序的絕對路徑 string path = Application.StartupPath; //獲取自身exe或dll的文件名路徑 string s = System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName; private void button2_Click( object sender, EventArgs e) { //打開該程序 //取該程序文件的路徑 //string path = Application.StartupPath; string path = System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName; //造一個進程 Process p = new Process(); //造一個進程的啟動信息 ProcessStartInfo ps = new ProcessStartInfo(path); //設置進程啟動信息 p.StartInfo = ps; //啟動進程 p.Start(); //關閉程序 this .Close(); } |
例:窗口實現鼠標拖動
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
private int x; private int y; private void pictureBox1_MouseDown( object sender, MouseEventArgs e) { //鼠標點擊時的XY坐標 x = e.X; y = e.Y; } private void pictureBox1_MouseMove( object sender, MouseEventArgs e) { //判斷鼠標按下的是左鍵 if (e.Button == System.Windows.Forms.MouseButtons.Left) { //邊距=當前的距離+移動的距離 this .Left = this .Left+(e.X - x); this .Top = this .Top +(e.Y - y); } } |
二、線程
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。
區別:進程有自己獨立的資源,線程共用資源。
Thread類, 命名空間:using System.Threading ;
程序默認只有一個主線程,如果做復雜處理,則會出現假死狀態,因為一條線程同時只能做一件事。
多線程的作用:同時做多件事情,節約時間,后臺運行程序,提高程序的運行效率,也不會使主界面出現無響應的情況。
創建線程:
開啟新的線程執行哪個函數
1
|
Thread th = new Thread( 里面寫線程要操作的方法,方法名不含括號 ); |
標記這個線程準備就緒了,可以隨時執行,CPU決定執行時間
th.Start();
線程分為兩種:
前臺線程 - 只有所有的前臺線程都關閉才能完成程序關閉。
后臺線程 - 只要所有的前臺線程都結束,后臺線程則會自動結束。
兩者的區別:應用程序必須運行完所有的前臺線程才可以退出;
而對于后臺線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的后臺線程在應用程序退出時都會自動
結束。
設置th線程為后臺線程
1
|
th . IsBackground = true ; |
控件由主線程創建,新線程想要訪問主線程資源,程序默認是不允許跨線程訪問的。
取消跨線程訪問限制
在界面Load事件里
Control.CheckForIllegalCrossThreadCalls = false;
FormClosing 事件中:
1
2
3
4
5
6
|
//判斷新線程是否為null,如果為null,那就自動關閉了 if (th != null ) { //立即結束線程,但是結束后就不能再被重新Start了 th.Abort(); } |
執行帶參數的函數:
如果線程執行的方法需要參數,那么要求這個參數必須是object類型!
1
2
3
|
Thread th = new Thread(Test); //參數名不需要帶括號 th . IsBackground = true ; th.Start( "123" ); //在這里傳入Test函數所需要的參數 |
這樣函數中就需要強轉:
1
2
3
4
5
|
private void Test ( object s) { string ss = ( string ) s ; ...... } |
以上所述是小編給大家介紹的WinForm 進程、線程及區別介紹,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/ShenG1/p/5839618.html