C#窗體 WinForm 進程,線程


一、進程

 

進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。

它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。

Process 類,用來操作進程。

命名空間:using System.Diagnostics;

 

Process.Start("calc");   //打開計算器
Process.Start("mspaint");   //打開畫圖
Process.Start("iexplore" , "http://www.baidu.com");  //打開瀏覽器並指定地址

 

(一)通過一個進程,打開指定的文件:

1.創建進程對象
Process p = new Process();

2.創建一個StartInfo對象,是指定帶盤符的路徑
ProcessStartInfo psi = new ProcessStartInfo(@"C:\user\.....);

3.進程指定及開始
p.StartInfo = psi; //指定路徑
p.Start(); //開始進程

 

(二)通過文件選擇框讓用戶自己選擇所需要打開的程序並打開:

 

復制代碼
        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();
            }         
        }
復制代碼

 

 

例子:注銷

 

//這個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();
        }
復制代碼

 

例:窗口實現鼠標拖動

 

復制代碼
        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 ;

程序默認只有一個主線程,如果做復雜處理,則會出現假死狀態,因為一條線程同時只能做一件事。

多線程的作用:同時做多件事情,節約時間,后台運行程序,提高程序的運行效率,也不會使主界面出現無響應的情況。

 

創建線程:

開啟新的線程執行哪個函數
  

  Thread th = new Thread( 里面寫線程要操作的方法,方法名不含括號 );

標記這個線程准備就緒了,可以隨時執行,CPU決定執行時間
  

  th.Start();

 

線程分為兩種:

 

前台線程  -  只有所有的前台線程都關閉才能完成程序關閉。

后台線程  -  只要所有的前台線程都結束,后台線程則會自動結束。

兩者的區別:應用程序必須運行完所有的前台線程才可以退出;

      而對於后台線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的后台線程在應用程序退出時都會自動結束。

 

設置th線程為后台線程

  

  th . IsBackground = true ;

 

控件由主線程創建,新線程想要訪問主線程資源,程序默認是不允許跨線程訪問的。

取消跨線程訪問限制
在界面Load事件里

  Control.CheckForIllegalCrossThreadCalls = false;

 

FormClosing 事件中:

  //判斷新線程是否為null,如果為null,那就自動關閉了
  if(th != null)
  {
    //立即結束線程,但是結束后就不能再被重新Start了
    th.Abort(); 
  }

 

執行帶參數的函數:

如果線程執行的方法需要參數那么要求這個參數必須是object類型!

  Thread th = new Thread(Test);   //參數名不需要帶括號
  th . IsBackground = true;
  th.Start("123");         //在這里傳入Test函數所需要的參數

這樣函數中就需要強轉:
  private void Test (object s)
  {
    string ss = (string) s ;
    ......
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM