Выход из цикла нажатием клавиши
Я пишу приложение с графическим интерфейсом Win32, которое имеет цикл, который я хотел бы перезапустить только после нажатия клавиши. Основной цикл уже запущен, и я не могу просто перезапустить его, поэтому мне нужно вставить точку "зависания", из которой пользователь может вручную вырваться. Код ниже представляет то, что я положил в конце моего основного цикла. Предполагается, что программа будет приостановлена, поместив ее в бесконечный цикл, который может быть прерван только при нажатии буквы "q".
for (;;)
{
char temp;
temp = _getch();
if (temp == 'q')
{
break;
}
}
Это успешно приводит к зависанию программы, но нажатие клавиши "q" ничего не делает для завершения цикла. Я понимаю, что использование cin.ignore() или cin.get() было бы предпочтительным, но по какой-то причине, когда я добавляю iostream в список заголовков, я получаю кучу ошибок, поэтому в настоящее время я пытаюсь сделать это с помощью _getch() с заголовком conio.h
Любая помощь высоко ценится.
4 ответа
По твоему вопросу трудно сказать, но похоже, что после каждой итерации цикла ты пытаешься предложить пользователю, хотят ли они продолжить. Я предполагаю, что бесконечное 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
, вы можете просто проверить код возврата функции (если вам не нужно сохранять входные данные для последующего использования).
Вы должны создать цикл обработки сообщений и подождать, пока не придет сообщение о нажатии клавиши. Попробуйте проверить этот пример.
В приложении с графическим интерфейсом Windows нет ввода для чтения из консоли.
Вы упомянули, что это приложение Win32 GUI. Во время входа в цикл вы создали Windows, которая может иметь фокус ввода? Если да, попробуйте перехватить сообщения WM_KEYDOWN/ WM_KEYUP. Если это консольное приложение, обратите внимание на функции консоли, особенно ReadConsole.
Сэм