Страниц: [1]
  Печать  
Автор Тема: kbhit  (Прочитано 4940 раз)
Anton_nesharu
Гость
« : Марта 28, 2003, 09:02:00 pm »

есть такая функция в Си ...читает последний символ с буфера клавиатуры, но в QNX такого походу нет
Что делать ? у меня цикл бесконечный и мне из него нужно выйти по нажатию клавиши. Как енто сделать ?
Записан
Evgeniy
Jr. Member
**
Offline Offline

Сообщений: 73


Просмотр профиля
« Ответ #1 : Марта 28, 2003, 09:23:00 pm »


Anton_nesharu пишет:
есть такая функция в Си ...читает последний символ с буфера клавиатуры, но в QNX такого походу нет
Что делать ? у меня цикл бесконечный и мне из него нужно выйти по нажатию клавиши. Как енто сделать ?

А вы уверены, что это именно "Си-функция", а не досовское расширение?
Дело в том, что в подавляющем большинстве систем обычно нет прямой передачи каждого введенного с клавиатуры символа во входной поток процесса, запросившего ввод с клавиатуры - передача данных выполняется, как правило, при вводе некоторого множества спецсимволов (Enter, CTRL+... и т.п.). Связано это с тем, что драйвер терминала обеспечиает возможность редактирования ввода самостоятельно независимо от приложений...
Записан
Anton_nesharu
Гость
« Ответ #2 : Марта 28, 2003, 11:31:00 pm »


[/quote]
А вы уверены, что это именно "Си-функция", а не досовское расширение?

не уверен
как мне проверить нажатие клавиши не останавливая цикл ?
Записан
Evgeniy
Jr. Member
**
Offline Offline

Сообщений: 73


Просмотр профиля
« Ответ #3 : Марта 29, 2003, 12:43:00 am »


Anton_nesharu пишет:


А вы уверены, что это именно "Си-функция", а не досовское расширение?

не уверен
как мне проверить нажатие клавиши не останавливая цикл ?
[/quote]

Посмотрите функцию select() - в Help есть пример с проверкой готовности данных на консоле и последовательном порту. Но имейте в виду, что ввод, скорее всего, будет готов не по нажатию клавиши, а по вводу строки или чего-то типа CTRL+
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #4 : Марта 29, 2003, 04:17:00 am »


//Check if "any key" was pressed, if yes break loop
     if (tcischars(1) > 0) break ;
   }
Записан
klalafuda
QOR.Team
****
Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #5 : Марта 29, 2003, 11:04:00 am »

для прерывания циклов в тестах можно использовать SIGINT:


static volatile int exit_signo;

static void signal_handler(int signo) {
   switch (signo) {
   case SIGINT :
       exit_signo = signo;
       break;
   default :
       break;
   }
} /* signal_handler */

struct sigaction sa;
sigset_t ss;

exit_signo = 0;

sigemptyset(&ss);
sa.sa_handler = signal_handler;
sa.sa_flags = 0;
sa.sa_mask = ss;
sigaction(SIGINT, &sa, NULL);

while {!exit_signo} {
   sigsuspend(&sa);      /* Wait for a signal */
   if (!exit_signo) {
       /* Do some work here.. */
   }
}


по крайней мере, это позволяет прерываться по Ctrl-Break и работает практически везде.

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

// wbr


[ Это Сообщение было отредактировано: klalafuda в 2003-03-29 08:05 ]
Записан
Anton_nesharu
Гость
« Ответ #6 : Марта 29, 2003, 04:43:00 pm »


while {!exit_signo} {
   sigsuspend(&sa);      /* Wait for a signal */
   if (!exit_signo) {
       /* Do some work here.. */
   }
}


я так понял процесс просто засыпает до сигнала... но мне енто не подходит...хотя я может не правильно понял ?
Записан
u-gen
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #7 : Марта 30, 2003, 06:48:00 pm »



я так понял процесс просто засыпает до сигнала... но мне енто не подходит...хотя я может не правильно понял ?

Дык система то многопотоковая (типа второй поток/пул? etc)
Записан
dmi
QOR.Admin
*****
Offline Offline

Сообщений: 470



Просмотр профиля
« Ответ #8 : Марта 31, 2003, 08:02:00 pm »

Да, классно запарили


rc = read (fileno(stdin), &c, 1);
if (rc)
   break;


Ну что-то вроде.
Записан
Страниц: [1]
  Печать  
 
Перейти в: