使用 keydown 启动线程并使用 keyup 释放线程来停止它

问题描述 投票:0回答:1

我正在尝试使用按键事件操作线程,我设法通过按两个键(即两个线程的“E”和“R”)来启动它们,但我无法通过释放按键来停止它们,keyup 事件不会由于某种原因工作。 (开始动作然后停止后,我想立即重新启动它们......所以不需要计时器......)

C#代码:

    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)

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

c# multithreading winforms events keydown
1个回答
0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.