Выход из цикла нажатием клавиши - PullRequest
0 голосов
/ 10 августа 2011

Я пишу приложение с графическим интерфейсом для Win32, в котором есть цикл, который я хотел бы перезапустить только после нажатия клавиши.Основной цикл уже запущен, и я не могу просто перезапустить его, поэтому мне нужно вставить точку «зависания», из которой пользователь может вручную вырваться.Код ниже представляет то, что я положил в конце моего основного цикла.Предполагается, что программа приостанавливается, помещая ее в бесконечный цикл, который может быть прерван только при нажатии буквы «q».

for (;;)
 {
 char temp;
 temp = _getch();

 if (temp == 'q')
  {
  break;
  }
 }

Это успешно приводит к зависанию программы, но нажатию клавиши «q»'ничего не делает, чтобы закончить цикл.Я понимаю, что использование cin.ignore () или cin.get () было бы предпочтительным, но по какой-то причине, когда я добавляю iostream в список заголовков, я получаю кучу ошибок, поэтому в настоящее время я пытаюсь сделать это с помощью _getch () с заголовком conio.h.

Любая помощь очень ценится.

Ответы [ 4 ]

2 голосов
/ 10 августа 2011

Вы можете просто позвонить MessageBox.

1 голос
/ 10 августа 2011

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

Вам не нужен бесконечный цикл: _getch() все равно остановит выполнение, пока не будет нажата клавиша. По правде говоря, тот факт, что вы поместили свое условие в цикл for, является причиной того, что break ведет себя не так, как вы хотите - вы break выходите из бесконечного цикла, но не ваш основной цикл обработки.

Пример:

while(1)
{
   // Do some processing
   for (;;)
   {
      char temp;
      temp = _getch();

      if (temp == 'q')
         break;   // This will break out of the for and continue the while
   }
}

против

while(1)
{
   // Do some processing
   if ('q' == _getch())
      break;             // This will break out of the while
}

Вы также заметите, что, поскольку _getch () возвращает char, вы можете просто проверить код возврата функции (если только вам не нужно сохранить входные данные для последующего использования).

0 голосов
/ 10 августа 2011

Вы упомянули, что это приложение Win32 GUI. Во время входа в цикл вы создали Windows, которая может иметь фокус ввода? Если да, попробуйте перехватить сообщения WM_KEYDOWN / WM_KEYUP . Если это консольное приложение, посмотрите Функции консоли специально ReadConsole .

Sam

0 голосов
/ 10 августа 2011

Вы должны создать цикл обработки сообщений и подождать, пока не придет сообщение о нажатии клавиши Попробуйте проверить этот пример .

В приложении с графическим интерфейсом Windows нет ввода для чтения из консоли.

...