2014-09-13 30 views
-3

所以即時嘗試操作線程的關鍵事件,我設法讓他們開始擊中關鍵E和R(兩個線程),但我無法通過放寬鍵來阻止他們,由於某種原因,鍵入事件不起作用... 用keydown啓動線程並通過釋放它(keyup)來停止它?

的C#Windows應用程序代碼(開始,停止我想在需要時重新啓動它們...所以沒有計時器後...):(方法我使用)

private void Yawspeed_KeyDown(object sender, KeyEventArgs e) 
    { 
     Thread yawspeedRightThread = new Thread(new ThreadStart(YawspeedRightThread)); 
     Thread yawspeedLeftThread = new Thread(new ThreadStart(YawspeedLeftThread)); 

     if (e.KeyCode == Keys.E) 
     { 
      yawspeedRightThread.Start(); 
     } 
     if (e.KeyCode == Keys.R) 
     { 
      yawspeedLeftThread.Start(); 
     } 
    } 

((法會是這樣的東西?:

private void Yawspeed_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.E) 
    { 
     yawspeedRightThread.Abort(); 
    } 
    if (e.KeyCode == Keys.R) 
    { 
     yawspeedLeftThread.Abort(); 
    } 
} 

(截至...)

private void Yawspeed_Load(object sender, EventArgs e) 
    { 

    } 

    #region Thread Functions 
    /// <summary> 
    /// This thread will move your cursor 
    /// </summary> 
    public static void YawspeedRightThread() 
    { 


     while (true) 

...(代碼休息時,線程本身,功能...)

+0

你能提供一個更清晰的描述你打算做什麼?這似乎有點不尋常...... – Kris 2014-09-13 12:00:37

+6

你已經問過這個問題。看起來你刪除了前一個,也破壞了SO用戶添加的評論。這對任何人都沒有幫助,請不要這樣做。 – 2014-09-13 12:03:32

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup%28v=vs.110%29.aspx Control.KeyUp Event「在控件發佈時釋放密鑰時發生有重點。「,它仍然有焦點嗎? – 2014-09-13 12:09:22

回答

0

首先你無法重新啓動一個線程。如果你啓動一個線程,線程完成,然後你嘗試再次啓動同一個線程對象,它會拋出一個異常,告訴你這是不可能的。您應該考慮使用Thread Pool來代替。

現在,假設您將忽略上述內容並嘗試執行此操作。需要檢查的兩件事是:

  1. 您已經在控件/表單中註冊了關鍵事件。
  2. 在您執行測試時,控件/窗體實際上有焦點。

最後,確保密鑰實際上沒有被調用。我這樣說的原因是Thread.Abort()實際上並不保證結束線程的執行。它只是在線程中引發異常。這意味着如果你在捕獲到「Exception」對象的線程函數內添加了一個try catch,try catch將捕獲Abort強制插入的異常並允許線程繼續執行。這個事實是爲什麼不推薦Abort的原因之一,並鼓勵人們使用其他機制來結束線程,如跳閘布爾值。

相關問題