2015年12月22日 星期二

處理序與執行緒的關係

  • 一個執行緒只屬於一個處理序,而一個處理序可以有多個執行緒,或至少有一個執行緒。
  • 資源分配給處理序,在同一個處理序的所有執行緒共用該處理序的所有資源。
  • 處理器分給執行緒,即真正在處理器上運行的是執行緒。
  • 執行緒在執行過程中,需要協作同步。不同的執行緒間可利用訊息通訊的辦法實作同步。 
在C#中提供了一個System.Diagnostics命名空間,在這個命名空間裡封裝了所有操作處理序的類別。其中,最主要的處理序操作類別是Process類別,該類別提供對本地和遠端處理序的存取,並能夠啟動和停止本地系統處理序。例如:

1.啟動一個處理序
Public static void Main( )
{
  Process p = new Process ( ) ;
  p.StartInfo.FileName = "notepad.exe" ; //設置需要啟動處理序的名稱
  p.StartInfo.WindowsStyle = ProcessWindowsStyle.Maximized; //在設定啟動處理序時,新視窗的顯示樣式
  p.Start ( ) ;//開始啟動處理序
 }


2.關閉一個處理序
Public static void Main( )
 {
   Process [ ] p = Process.GetProcessesByName ("notepad") ;
   if (p.Length > 0 )
   {
     if ( !p [0].HasExited)  //用來確定處理序是否關閉,假如已經關閉則回傳true屬性值,否則為false
     {
        if ( p[0].Responding) //發送一個請求介面,假如立即有回應則回傳一個true
        {
           p[0].CloseMainWindow ( ) ; //叫用 CloseMainWindows方法關閉應用程式
         }
       else
       {
          p[0].Kill ( ) ;//若沒有回應則叫用Kill方法強制處理序關閉。
        }
      }
    }
  }

3.獲得目前電腦系統內所有已啟動的處理序

Public static void Main ( )
 {
   Process [ ] processOnComputer = Process.GetProcesses ( ) ;
   foreach (Process p in processOnComputer)
   {
      Console.WriteLine (p.ToString ( ) );
   }
 }

4.簡單的執行緒例子
using System ;
using System.Threading ;
namespace Test_Thread
 {
   public class Test
   {
     public static void ThreadA ( )
     {
       for (int i = 0 ; i < 3 ; i++ )
       {
         Console.WriteLine ( "執行緒 A : {0} ", i ) ;
        }
      }
     public static void ThreadB ( )
     {
       for (int i = 0 ; i < 3 ; i++ )
       {
         Console.WriteLine ("執行緒B : {0} ", i ) ;
        }
      }
   public static void Main ( )
    {
      Console.WriteLine ("開始啟動執行緒 :") ;
      Thread a = new Thread (new ThreadStart (ThreadA)) ;
      Thread b = new Thread (new ThreadStart (ThreadB)) ;
   
     //叫用Start ( )可以啟動執行緒,但是叫用Start ( )之後,新執行緒並不處於Running狀態,而是處於Unstarted狀態。作業系統的執行緒調度器選擇了要運行的執行緒之後,執行緒才會改變為Running狀態。
      a.Start ( ) ;
      b.Start ( ) ;
     }
   }
 }

    
    

沒有留言:

張貼留言