Как получить ввод с клавиатуры, одновременно занимаясь другими делами? - PullRequest
10 голосов
/ 15 октября 2010

Я использую C (gcc) и ncurses, чтобы создать программу, которая будет отслеживать данные, поступающие с последовательного порта. Программа имеет большой while, где она читает данные, поступающие из порта, и в то же время печатает эту информацию на экране ...

Но проблема здесь:

Как он может читать ввод с моей клавиатуры (так как getch() останавливает программу до получения ввода) и в то же время считывать информацию, поступающую из порта?

Может быть, я должен использовать другой способ (не большой while), поэтому идеи приветствуются!

Ответы [ 5 ]

8 голосов
/ 15 октября 2010

сделать getch неблокирующим вызовом с использованием опции nodelay .

nodelay(stdscr,TRUE);

Дополнительную информацию можно найти по адресу http://www.gsp.com/cgi-bin/man.cgi?topic=nodelay

0 голосов
/ 12 сентября 2013

используйте cbreak(), чтобы отключить буферизацию строки

nodelay(win, TRUE); 

, чтобы получить неблокирующую функцию getch().

0 голосов
/ 15 октября 2010

Попробуйте select() или poll().Они оба делают одно и то же, но с разными интерфейсами.Вы даете ему список файловых дескрипторов, и он будет ждать, пока хотя бы один из этих дескрипторов будет готов, затем вернется и скажет, какие из них можно прочитать (или записать) без блокировки.Проверьте ссылки для примеров и более подробной информации.

0 голосов
/ 15 октября 2010

Может быть fork ()? Просто имейте в виду, что дочерний процесс выполняется в отдельном процессе, поэтому переменные не могут быть напрямую разделены между ними

pid_t pID = fork();
if (pID == 0) {                // child
   // Code  executed only by child process
   // getch() ...
} else if (pID < 0) {          // failed to fork
   // Throw exception
   // ... 
} else {                       // parent
   // Code executed only by parent process
   // ...
}
0 голосов
/ 15 октября 2010

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

(conio.h)

...