如何接受单独线程的按键?

时间:2014-09-06 16:45:15

标签: c# multithreading keypress

我正在使用c#实现调试器,它应该如下工作: (这是一个使用msscript.ocx控件的vbscript调试器)

在带断点的行上它应该等待{F5}键,并且在有{F5}键时它应该移动到下一个代码行。

现在的问题是在调试方法中(在命中断点时调用此方法) 继续在循环中移动检查静态变量设置为true(控件上的按键事件将此静态变量设置为true)。

应用程序没有响应,我必须停止它。

以下是代码:

为控件编写以下代码以接受控件上的{F5}键(说出文本框控件)

private void fctb_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.F5)
{
    //Setting the static variable true when the control recieves a {F5} key
    dVar = true;
}
}

在命中断点之后运行的另一个方法在继续之前检查dVar值: 它如下所示:

while (!dVar)
{
System.Threading.Thread.Sleep(100); 
}

这里的问题是,当它进入while循环时,它会停止接受按键并且没有响应。

需要一种暂停代码执行的方法,直到收到所需的按键时为止。

我们是否可以有一个单独的线程来检查{F5}键按下并且不会使应用程序无响应。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

问题和答案真的很难理解。

首先,使用F10作为步骤键,这在当今非常标准。

要按键上的程序锁定,您可以使用以下内容:

while (Console.ReadKey().Key != ConsoleKey.F11);

这很好,因为它不会循环。 ReadKey()方法暂停执行,直到实际按下某个键。所以这里没有浪费CPU资源。


编辑:带有静态变量的窗体

在评论中,您发布了以下代码:

private void fctb_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.F5)
    {
        dVar = true;
    }
}

您现在需要做的就是在处理事件后立即重置其他方法/线程上的值:

// some code...

while (!dVar)
{
    System.Threading.Thread.Sleep(100); // don't ever loop without throttling CPU down
}

dVar = false; // event handled

// some code...