2012-06-04 220 views
0

我有一個C#程序來winform應用程序。它的目的是作爲一個記憶遊戲。首先,我必須顯示一個包含數值的矩陣。說3或4.我必須暫停矩陣一段時間,以便用戶將其保存在他的記憶。爲此,我使用thread1。然後我需要空白矩陣並在窗體的右側顯示一些選項。它使用Thread2完成。現在的問題實際上是首先執行thread2。誰能幫我please.I是新來的C#...在C中執行線程#

Thread Thread1 = new Thread(new ParameterizedThreadStart(invokedisplaymatrix)); 
Thread1.IsBackground = true; 
Thread1.Start(MatrixInfoValues); 


      Thread Thread2 = new Thread(new ThreadStart(invokedisplayblankmatrix)); 
      Thread2.IsBackground = true; 
      Thread2.Start(); 
} 

private void invokedisplaymatrix(object indx) 
      { 
    Invoke(new displaymatrixdelegate(displaymatrix),new object[] {indx}); 

Thread.sleep(5000); 
       } 

private void invokedisplayblankmatrix() 
     { 
Invoke(new displayblankmatrixdelegate(displayblankmatrix)); 
     }... 

.. public delegate void displaymatrixdelegate(int[] ind1); 
    public delegate void displayblankmatrixdelegate(); 
}//end of main form 
+1

線程運行* *同時 - 他們做什麼,他們將與現有的CPU給他們。如果你想讓他們成爲*,你可能意味着一個工作隊列,而不是單獨的線程。 –

回答

2

你可能想看看的TPL。開箱即用的任務支持您的方案(通過ContinueWith方法)。

我不知道爲什麼你需要2個線程 - 儘管線程在做並行工作時很好用,這看起來並不像這裏的情況。

5

創建Thread2並在invokedisplaymatrix結束時啓動它。

但是,我不確定爲什麼你要使用線程,但是並不意味着要進行任何併發。

+0

能否請你建議我如何在計時器/任何其他代碼中做到這一點?非常感謝 – Kavitha

0

您應該使用AutoResetEvent來實現它。

所以......

var sync = new AutoResetEvent(); 

var thread1 = new Thread(new ParameterizedThreadStart(invokedisplaymatrix)); 
thread1.IsBackground = true; 
thread1.Start(MatrixInfoValues); 


thread Thread2 = new Thread(new ThreadStart(invokedisplayblankmatrix)); 
thread2.IsBackground = true; 
thread2.Start(); 

private void invokedisplaymatrix(object indx) 
{ 
    Invoke(new displaymatrixdelegate(displaymatrix),new object[] {indx}); 
    Thread.sleep(5000); 
    sync.Set(); 
} 

private void invokedisplayblankmatrix() 
{ 
    sync.Wait(); 
    Invoke(new displayblankmatrixdelegate(displayblankmatrix)); 
} 

但你並不需要separete線程來實現這種情況下,這是簡單的一個線程任務。

+0

我無法聲明autoreset event.Could你請教我如何使用單線程完成?我需要顯示矩陣顯示5秒,然後在答案面板中顯示答案的選項。非常感謝。 – Kavitha

+0

您可以使用Timer執行此操作 –

0

看System.Threading.Semaphore:

此示例中

,我們需要最前一頁運行「WORK2」委託:

static void Main(string[] args) 
{ 
    var sem = new Semaphore(0, 1); 

    Action<object> work1 = o => 
    { 
     sem.WaitOne(); 
     Console.WriteLine("enter " + o); 
     Thread.Sleep(2000); 
     Console.WriteLine("exit " + o); 
    }; 

    Action<object> work2 = o => 
    { 
     Console.WriteLine("enter " + o); 
     Thread.Sleep(2000); 
     Console.WriteLine("exit " + o); 
     sem.Release(); 
    }; 

    work1.BeginInvoke("first", ar => { }, null); 
    work2.BeginInvoke("second", ar => { }, null);  

    Console.ReadKey(); 
}