用keydown启动线程并通过释放它(keyup)来停止它?

时间:2014-09-13 11:43:42

标签: c# multithreading winforms events keydown

所以我试图用关键事件操作线程,我设法通过按键E和R(两个线程)开始,但我不能通过重新发布键来阻止它们,键盘事件由于某种原因不起作用.. 。 (开始后,停止我想在需要时重启它们......所以没有计时器......)

C#WINDOWS APPLICATION代码:(我正在使用的方法)

    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)

...(其余代码,线程本身,函数......)

1 个答案:

答案 0 :(得分:0)

首先,您无法重新启动线程。如果你启动一个线程,线程结束,然后你尝试再次启动同一个线程对象,它会抛出一个异常,告诉你这是不可能的。您应该考虑使用Thread Pool代替。

现在假设您将忽略上述内容并尝试执行此操作。要检查的两件事是:

  1. 您已使用控件/表单注册了关键活动。
  2. 当您执行测试时,控件/表单实际上具有焦点。
  3. 最后,确保实际上没有调用密钥。我这说的原因是Thread.Abort()实际上并不能保证结束线程的执行。它只是在线程中抛出一个异常。这意味着如果你做了类似的事情,在线程的函数中添加了一个捕获“异常”对象的try catch,try catch将捕获Abort强制进入它并允许线程继续执行的异常。这个事实是不推荐Abort的一个原因,鼓励人们使用其他机制来结束一个线程,比如跳过布尔值。