2014-09-13 2 views
-3

Так что я пытаюсь управлять потоками с ключевыми событиями, мне удалось заставить их начать, нажав клавишу E и R (два потока), но я не могу их остановить, обновив ключи, событие keyup не работает по какой-то причине ... (после запуска, остановки я не хотел бы, чтобы перезапустить их при необходимости ... так что нет таймера ...)Начать тему с 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

+6

Вы уже задали этот вопрос. Похоже, вы удалили предыдущий, также уничтожили комментарии, добавленные пользователями SO. Это не полезно никому, пожалуйста, не делайте этого. –

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup%28v=vs.110%29.aspx Событие Control.KeyUp «Происходит при отпускании ключа во время управления имеет фокус ». У него все еще есть фокус? –

ответ

0

Прежде всего, вы не можете перезапустить поток. Если вы начинаете поток, поток заканчивается, а затем вы пытаетесь запустить тот же объект потока во второй раз, когда он выдаст исключение, говорящее вам, что это невозможно. Вместо этого вы должны посмотреть на использование Thread Pool.

Теперь предположим, что вы проигнорируете вышеизложенное и попытаетесь сделать это в любом случае. Две вещи для проверки:

  1. Вы зарегистрировали событие ключа с помощью элемента управления/формы.
  2. Элемент управления/формы на самом деле имеет фокус во время выполнения теста.

Наконец, убедитесь, что ключ фактически не вызван. Причина, по которой я говорю, заключается в том, что Thread.Abort() на самом деле не гарантирует прекращения выполнения потока. Он просто генерирует исключение в потоке. Это означает, что если вы сделали что-то вроде добавленной попытки поймать внутри функции потока, которая поймала объект «Исключение», улов try поймает исключение, которое Abort принудительно запустит в него и позволит продолжить выполнение потока. Этот факт является одной из причин, по которым Abort не рекомендуется, и людям предлагается использовать другие механизмы для прекращения потока, например, отключение булева.

Смежные вопросы