завершить цикл для ввода с клавиатуры C # - PullRequest
0 голосов
/ 11 мая 2018

часы автоматически запустят myclock. Отметьте и отобразите на консоли. и я хотел бы сбросить часы, когда я нажимаю пробел.

однако кажется, что я не могу завершить цикл, когда нажимаю пробел.

Итак, как мне сбросить часы по ключевому входу?

это из-за 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;
                        }
                    }
                }
            }            
    }

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вам нужно будет прослушать событие нажатия клавиши, а затем обработать его, например, установить флаг для цикла для проверки.

Взято из: Попытка обнаружить нажатие клавиши

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.F1 && e.Alt)
    {
        //do something
    }
}
0 голосов
/ 11 мая 2018

Может быть, какое-то дополнение для вашего понимания:

Проблема в том, что ваш внутренний цикл for блокирует цикл do-while.Условие do-while не проверяется до тех пор, пока цикл for не завершится.

Попробуйте использовать метод для проверки ввода ключа в цикле увеличения тактовой частоты.

Редактировать:Я не могу сказать, поможет ли простая проверка по нажатию клавиши, как указано в других ответах.Я предполагаю, что для этого потребуется программа, чтобы обнаружить нажатие клавиши как раз в тот момент, когда цикл 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();
0 голосов
/ 11 мая 2018

Попробуйте использовать Console.KeyAvailable, как показано в примере ниже. В вашем случае обработайте выход внутри оператора if:

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