我正在尝试使用按键事件操作线程,我设法通过按两个键(即两个线程的“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)
...(其余代码、线程本身、函数...)
首先,你不能重新启动线程。如果您启动一个线程,该线程将完成,然后您尝试第二次启动同一个线程对象,它将抛出一个异常,告诉您这是不可能的。您应该考虑使用 Thread Pool 来代替。
现在假设您将忽略上述内容并尝试执行此操作。需要检查的两件事是:
最后,确保按键实际上没有被调用。我这样说的原因是 Thread.Abort() 实际上并不能保证结束线程的执行。它只是在线程中抛出异常。这意味着,如果您在捕获“Exception”对象的线程函数中添加了 try catch 之类的操作,则 try catch 将捕获 Abort 强制进入的异常并允许线程继续执行。这一事实是不建议使用 Abort 并鼓励人们使用其他机制来结束线程的原因之一,例如触发布尔值。