c#While循环问题

时间:2015-07-03 16:59:21

标签: c# debugging while-loop keyboard-events

    while (TOGGLE == false) {

            if (Keyboard.IsKeyDown(Key.A)) { RESULT = RESULT + "A";}
            if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); }
            if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); }
    }

好的,所以当我点击B或C键时,一切正常,它会将字添加到字符串变量RESULT中,但是当我点击A时,它会向RESULT字符串添加无限量的A' s。我做错了什么?

修改: 我知道我没有将TOGGLE设置为false。但这就是重点!我会更好地解释一下:这个应用程序将在后台运行。因此,当客户端在记事本中写入时,该程序将检测他按下的每个键并将其添加到RESULT字符串。我不希望这个while循环在按下一个键时立即停止。我希望它循环,直到客户端完成写入记事本(当我将TOGGLE设置为false时)。

4 个答案:

答案 0 :(得分:0)

因为你在消息框出现时阻塞了循环,但是对于A,没有消息框可以防止ui线程在A键仍被按下时继续绕循环。

你需要

break;
在你追加你的字符串之后

跳出循环,或者显示一个消息框,具体取决于你想要实现的目标。

答案 1 :(得分:0)

当您显示消息框时,它会停止while循环继续,因为对消息框的调用是阻止调用。这意味着在消息框关闭之前代码不会继续执行。

在您的示例中,当您按A时,未显示消息框,因此循环继续。要解决此问题,您必须将Toggle设置为true。

while (TOGGLE == false) 
{
    if (Keyboard.IsKeyDown(Key.A)) 
    { 
        RESULT = RESULT + "A";
        TOGGLE = true;
    }
    if (Keyboard.IsKeyDown(Key.B)) 
    { 
        RESULT = RESULT + "B"; 
        MessageBox.Show(RESULT);
        TOGGLE = true;
    }
    if (Keyboard.IsKeyDown(Key.C)) 
    {
        RESULT = RESULT + "C"; 
        MessageBox.Show(RESULT); 
        TOGGLE = true;
    }
}

答案 2 :(得分:0)

你的循环非常非常快。按下“A”键一秒意味着它将按下几千个循环周期。添加System.Threading.Thread.Sleep(100);会使循环挂起一点。

也许这可以帮助你实现你想要的目标:

while (TOGGLE == false)
{
    if (Keyboard.IsKeyDown(Key.A)) { RESULT = RESULT + "A"; System.Threading.Thread.Sleep(100); }
    if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); }
    if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); }
}

没有Thread.Sleep

的另一种解决方案
DateTime lastAletter = DateTime.Now;
while (TOGGLE == false)
{
     if (Keyboard.IsKeyDown(Key.A) && lastAletter.AddMilliseconds(100) < DateTime.Now) { RESULT = RESULT + "A"; lastAletter = DateTime.Now; }
     if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); }
     if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); }
 }

使用KeyPress event会更有效率并且记住while(true)处理器处于饥饿状态

答案 3 :(得分:0)

我知道我没有将TOGGLE设置为false。但这就是重点!我会更好地解释一下:这个应用程序将在后台运行。因此,当客户端在记事本中写入时,该程序将检测他按下的每个键并将其添加到RESULT字符串。我不希望这个while循环在按下一个键时立即停止。我希望它循环,直到客户端完成写入记事本(当我将TOGGLE设置为false时)。