【问题标题】:end the for loop by keyboard input C#通过键盘输入C#结束for循环
【发布时间】:2018-05-11 11:01:08
【问题描述】:

时钟将自动运行 myclock.Tick 并显示在控制台上。 我想在按空格键时重置时钟。

但是,当我按下空格键时,我似乎无法结束循环。

那么,如何通过键盘输入重置时钟?

是因为 console.readkey

正确的 Program.cs:

public static void Main(string[] args)
    {
        Clock myclock = new Clock();
        while (true)
        {
            Console.WriteLine("Press 'spacebar' to view the time and 'r' to reset the time");
            if (Console.ReadKey().Key == ConsoleKey.Spacebar)
            {
                for (int i = 0; i < 86400;i++)
                {
                    myclock.displayTime();
                    Thread.Sleep(1000);
                    myclock.Update();

                    if  (Console.KeyAvailable)
                    {
                        ConsoleKeyInfo cki = Console.ReadKey(true);
                        if (cki.Key == ConsoleKey.R)
                        {
                            myclock.ClockReset();
                            Console.WriteLine("\nClock has been reset");
                            break;
                        }
                    }
                }
            }            
    }

【问题讨论】:

  • 所以你想结束循环或重置时钟?
  • 我想按空格键重置时钟
  • 我不认为这种方法是正确的,也许如果您告诉我们,您想要达到什么目标,我们将能够为您提供帮助。

标签: c# for-loop input keyboard


【解决方案1】:

尝试使用 Console.KeyAvailable,如下例所示。在您的情况下,处理 if 语句中的退出:

 while( true )
    {
      if( Console.KeyAvailable ) // since .NET 2.0
      {
        char c = Console.ReadKey().KeyChar ;
        Console.Write( c );
      }
    }

【讨论】:

    【解决方案2】:

    为了你的理解,可能有一些补充:

    问题是你的内部 for 循环阻塞了 do-while 循环。在 for 循环完成之前不会检查 do-while 的条件。

    尝试使用一种方法来检查时钟递增循环中的按键输入。

    编辑:我不能说像其他答案中所述的对按键的简单检查是否会有所帮助。我想这需要程序来检测按键就在处理for循环的那一刻。如果您至少一秒钟未按空格键,则此操作的可能性很低。

    一个合适的解决方案可能是将时钟的增量放入另一个不会阻塞您的输入线程的线程/任务中。

    编辑 2:您还应该知道,在您的示例中显示的时间延迟了一秒,因为您首先增加时间值,然后等待一秒钟,然后才显示增加的时间。如果你这样做,你应该考虑这样做:

    myclock.Tick();
    myclock.displayTime();
    
    // Increment and display first, then put thread to sleep
    Thread.Sleep(1000);
    

    或者,如果你想从零开始:

    myclock.displayTime();
    
    Thread.Sleep(1000);
    myclock.Tick();
    

    【讨论】:

    • 感谢您的建议。我认为这是问题所在,因为它阻止了我的输入。能给我举个例子吗?
    • 尝试@chris-aby-antony 发布的方法来检查for循环中的按键和break循环是否满足条件。但正如我所说,这需要你在最坏的情况下按住空格键一秒钟。
    • 它确实需要我按住空格键.....如果我释放空格键它不会实现......
    • 是的 - 那是因为你的外部如果。删除它,不再需要按住空格键。您还可以考虑在重置时钟时将 i 设置回零。
    【解决方案3】:

    您将需要监听按键事件,然后处理该事件,例如为循环设置一个标志以进行检查。

    取自: Trying to detect keypress

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyCode == Keys.F1 && e.Alt)
        {
            //do something
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2015-06-07
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多