делать, пока бесконечный цикл останавливается на вводе с клавиатуры - C - PullRequest
2 голосов
/ 25 февраля 2010

есть способ запустить бесконечный цикл, который останавливается только при вводе пользователем с клавиатуры не спрашивая каждый цикл, чтобы продолжить? в программе C (Я разрабатываю чат C, который читает записи с циклом for(;;), и мне нужно останавливать его, только когда пользователь хочет напечатать и отправить сообщение)

Ответы [ 2 ]

6 голосов
/ 25 февраля 2010

Вы не указали ОС, поэтому я предполагаю, что некоторые POSIX-совместимые ОС.

Вы можете использовать , выбрать . Это может быть использовано для блокировки набора файловых дескрипторов (в вашем случае stdin) с ограниченным тайм-аутом или неопределенной блокировкой.

Я предполагаю, что, поскольку это программа чата, вы также захотите сделать это с другим дескриптором файла, например, с сокетом tcp чата. Таким образом, вы можете проверить входные данные с помощью one call.

В случае консоли Windows вы должны иметь возможность использовать GetStdHandle и WaitForSingleObject / WaitForMultipleObjects, если select не работает для вас.

2 голосов
/ 25 февраля 2010

Есть несколько способов сделать это в Windows. Предполагая, что вы используете VC ++, самый простой способ - это использовать _kbhit(). Если вы хотите использовать Win32 API напрямую, вы можете вызвать GetNumberOfConsoleInputEvents() и посмотреть, не является ли возврат ненулевым.

Вы также можете выполнить перекрывающееся чтение, и каждый раз при вызове цикла WaitForSingleObject со значением тайм-аута 0. Нулевое ожидание означает, что оно немедленно вернется, независимо от того, есть вход или нет. Возвращаемое значение сообщит вам, есть ли у вас какие-либо данные: WAIT_TIMEOUT означает, что данные еще не прочитаны, а WAIT_OBJECT0 означает, что у вас есть данные, ожидающие обработки.

...