【问题标题】:Start thread with keydown and stop it by releasing it (keyup)?用keydown启动线程并通过释放它(keyup)来停止它?
【发布时间】:2014-09-13 11:43:42
【问题描述】:

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

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)

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

【问题讨论】:

  • 您能否更清楚地描述您打算做什么?好像有点不寻常……
  • 你已经问过这个问题了。看起来你删除了前一个,也破坏了 SO 用户添加的 cmets。这对任何人都没有帮助,请不要这样做。
  • msdn.microsoft.com/en-us/library/…Control.KeyUp 事件“在控件有焦点时释放键时发生。”,它仍然有焦点吗?

标签: c# multithreading winforms events keydown


【解决方案1】:

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

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

  1. 您已经使用控件/表单注册了按键事件。
  2. 在您执行测试时,控件/表单实际上具有焦点。

最后,确保 key up 实际上没有被调用。我这么说的原因是 Thread.Abort() 实际上并不能保证结束线程的执行。它只是在线程中引发异常。这意味着,如果您在线程函数中添加了一个捕获“异常”对象的 try catch,try catch 将捕获 Abort 强制进入其中的异常并允许线程继续执行。这一事实是不建议使用 Abort 并鼓励人们使用其他机制来结束线程的原因之一,例如触发布尔值。

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多