Страниц: [1]
  Печать  
Автор Тема: "Ненавязчивый" опрос клавиатуры  (Прочитано 9722 раз)
YuriyS
Гость
« : Августа 15, 2002, 01:00:00 pm »

   Ситуация такая: в программе (не в Фотоне) необходимо периодически опрашивать клавиатуру на предмет нажатия пользователем различных клавиш (Букв,стрелок,функциональных и т.п.). До сих пор все было прекрасно - был while, а в нем read() и switch по клавишам. Но возникла необходимость делать еще кое-что и тут наткнулся на то, что read() и ему подобные функции ввода упорно ждут, пока не получат нужного количества символов, а хотелось бы найти что-нибудь наподобие bioskey() в MS-DOS - чтоб смотрела, не нажато ли чего и сразу выходила - чтоб опрашивать клавиатуру в цикле, тогда в этом же цикле можно будет заодно делать и другие вещи, не дожидаясь ввода.
 Если кто знает функцию (можно и из ncurses), либо еще какие вещи, которые могут помочь в этом, напишите пожалста. Пока альтернативы - либо через клавиатурные прерывания BIOS, либо разбираться с потоками и нитями и делать опрос клавиатуры отдельно - то и другое требует времени, усилий, а также поиска и изучения немногочисленной и немногословной документации - может что попроще есть?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Августа 15, 2002, 01:26:00 pm »


  Ситуация такая: в программе (не в Фотоне) необходимо периодически опрашивать клавиатуру на предмет нажатия пользователем различных клавиш (Букв,стрелок,функциональных и т.п.). До сих пор все было прекрасно - был while, а в нем read() и switch по клавишам. Но возникла необходимость делать еще кое-что и тут наткнулся на то, что read() и ему подобные функции ввода упорно ждут, пока не получат нужного количества символов, а хотелось бы найти что-нибудь наподобие bioskey() в MS-DOS - чтоб смотрела, не нажато ли чего и сразу выходила - чтоб опрашивать клавиатуру в цикле, тогда в этом же цикле можно будет заодно делать и другие вещи, не дожидаясь ввода.

Переведи tty в нужный режим.

Используй O_NONBLOCK флаг в fcntl, cc_c[VTIME] в termios структуре, используй tcischars(), используй select() ...


#include <iostream.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>

inline char getch()
{
   struct termios raw_tios =
   {
   /* c_iflag */       0,
   /* c_oflag */       0,
   #ifdef __QNXNTO__
   /* c_cflag */       (CREAD|HUPCL),
   #else
   /* c_cflag */       (CREAD),
   #endif
   #ifdef __QNXNTO__
   /* c_lflag */       0,
   #else
   /* c_lflag */       (IEXTEN),
   #endif
   };

   struct termios tios;
   tcgetattr(1, &tios);
   while (tcischars(1) == 0) {}
   tcsetattr(1, TCSANOW, &raw_tios);
   char ch;
   read (1, &ch, 1);
   tcsetattr(1, TCSANOW, &tios);
   cout.setf(ios::unitbuf);
   return ch;
}

inline char getche()
{
   char ch = getch();
   cout << ch;
   return ch;
}

inline int kbhit()
{
   if (tcischars(1) > 0)
      return 1;
   else
      return 0;
}


Еще кусок:


int raw(int fd)
{
struct termios termios_p;

if( tcgetattr( fd, &termios_p ) )
 return( -1 );

termios_p.c_cc[VMIN]  =  1;
termios_p.c_cc[VTIME] =  0;
termios_p.c_lflag &= ~( ECHO|ICANON|ECHOE|ECHOK|ECHONL );
termios_p.c_oflag &= ~( OPOST );
termios_p.c_iflag &= ~(IXON | BRKINT | PARMRK);

return( tcsetattr( fd, TCSADRAIN, &termios_p ) );
}

int unraw(int fd)
{
struct termios termios_p;

if( tcgetattr( fd, &termios_p ) )
 return( -1 );

termios_p.c_lflag |= ( ECHO|ICANON|ISIG|ECHOE|ECHOK|ECHONL );
termios_p.c_oflag |= ( OPOST );

return( tcsetattr( fd, TCSADRAIN, &termios_p ) );
}



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


timeout(0);
ESCDELAY=1;


а также поиска и изучения немногочисленной и немногословной документации - может что попроще есть?


Документации на эту тему хоть ж.ой жри, было бы желаение разбираться, неужели это так сложно ? Если сложно, то нафига лезть вообще в программирование ? А почитать news://inn.qnx.com тоже сложно ? Там эти вопросы задаются каждый день ... в последнее время на них уже не отвечают ...

Ты меня извини за грубость, но такая постановка дел, как нежелание тратить и время и усилие это уже слишком ...
Записан

YuriyS
Гость
« Ответ #2 : Августа 15, 2002, 02:37:00 pm »

"Документации на эту тему хоть ж.ой жри, было бы желаение разбираться, неужели это так сложно ?"

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

"Если сложно, то нафига лезть вообще в программирование ?"

Ну согласен - это я с аргументацией переборщил - хотел сказать, что можно написать свое и изобрести велосипед, что безусловно полезно для общего развития личности, но если время ограничено, и возможно то же самое можно сделать, просто вызвав функцию ОС...

"А почитать news://inn.qnx.com тоже сложно ?"

Ну раз уж речь зашла, хоть и не совсем по теме раздела, но в продолжение пояснения может подскажешь, какое ПО надо поставить, чтоб эти новости читать можно было а то IE ругается, говорит, "Для чтения групп новостей Интернета необходимо установить соответствующее ПО" (в Инете я тоже недавно и с этим протоколом еще не сталкивался, такой я вот ламер ). (Через браузер QNX - у нас проблемы с прокси так что пока только через IE).


Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #3 : Августа 15, 2002, 02:51:00 pm »


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

Это по прежнему Unix какой бы он не был специфический внутри, а по tc* функциям информации хватает более чем.


Ну раз уж речь зашла, хоть и не совсем по теме раздела, но в продолжение пояснения может подскажешь, какое ПО надо поставить, чтоб эти новости читать можно было а то IE ругается, говорит, "Для чтения групп новостей Интернета необходимо установить соответствующее ПО" (в Инете я тоже недавно и с этим протоколом еще не сталкивался, такой я вот ламер ). (Через браузер QNX - у нас проблемы с прокси так что пока только через IE).

Outlook Express читает это все на ура + у меня еще стоит FidoLook для удобства. Просто ткни в эксплорере на эту ссылку news://inn.qnx.com и все.
Записан

olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #4 : Августа 15, 2002, 10:46:00 pm »


YuriyS пишет:
(Через браузер QNX - у нас проблемы с прокси так что пока только через IE).

Да, с прокси в QNX есть некоторые проблемы (в инсталлере, phFTP ...), но с Интернет (HTTP) - эта беда решаема: ставьте Opera, настраивайте Preference - Connect ... милости просим.
Записан
Evgeniy
Jr. Member
**
Offline Offline

Сообщений: 73


Просмотр профиля
« Ответ #5 : Августа 15, 2002, 10:57:00 pm »


YuriyS пишет:
...
Пока альтернативы - либо через клавиатурные прерывания BIOS, либо разбираться с потоками и нитями и делать опрос клавиатуры отдельно - то и другое требует времени, усилий, а также поиска и изучения немногочисленной и немногословной документации - может что попроще есть?


Уважаемый ЮрийС!
Поверьте мне, лучше потратить ночь-другую (а на самом деле значительно меньше) на разбирательство с тредами, чем 20 минут на слепливание чего-то в духе DOS. По любому в реальном времени без потоков/процессов жить нельзя, но и в "обычном" программировании многие вещи становятся проще и надежнее при формулировке через параллельные процессы.
А потоковые функции в системном Help описаны достаточно подробно.
Если что-то конкретное не понятно - можете писать мне напрямую - для такого дела время найду
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #6 : Августа 16, 2002, 04:36:00 pm »


//Wait for interrupt event
   while(1) {
       InterruptWait(0,NULL);

....

//Check if "any key" was pressed, if yes break loop
     if (tcischars(1) > 0) break ;
   }

Не уверен, что это хороший способ для unix но возможно это то, что вы спрашивали. Пример взят из статьи про аппаратный RTC на этом сайте в разделе разработчику. Подробная инфа на функцию есть в хелп системе. Там же select(), readcond() и много другого интересного.

2lestat Пока этот пост правил, ты уже успел свой смайл втулить... Я про то, что в хэлпе есть всё для ответа на вопрос.

А новости я читаю программой Микрософт мэйл и ньюс от вин 95 -нахожусь за прокси...  Для QNX (и прочих) есть tin - хорошая вещь Также новости можно читать по веб сквозь гугли.
http://groups.google.com/groups?hl=ru&group=qdn.public.qnxrtp


[ Это Сообщение было отредактировано: ed1k в 2002-08-16 13:54 ]
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #7 : Августа 16, 2002, 04:40:00 pm »


Не уверен, что это хороший способ для unix но возможно это то, что вы спрашивали. Пример взят из статьи про аппаратный RTC на этом сайте в разделе разработчику. Подробная инфа на функцию есть в хелп системе.

Странно, а то, что я писал выше - я подергал, включая и твои письма, в inn.qnx.com
Записан

t-sash
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #8 : Ноября 08, 2002, 08:30:00 pm »

ламерский вопрос,подскажите,какая в qnx есть функция что то типа gotoxy()?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #9 : Ноября 09, 2002, 11:58:00 am »


ламерский вопрос,подскажите,какая в qnx есть функция что то типа gotoxy()?

Читаешь доки в хелпе по devc-con смотришь что надо послать за ESC-последовательность на экран и ее посылаешь - читается и пишется за 2 минуты, или используй ncurses.
Записан

YuriyS
Гость
« Ответ #10 : Ноября 11, 2002, 10:41:00 am »


ламерский вопрос,подскажите,какая в qnx есть функция что то типа gotoxy()?

Ну или, если не нужна ncurses - еще извратный способ, но рабочий - сам когда-то пользовался - прекрасно работают функции прерывания int 10h - пишешь процедурки и потом вызываешь (Я не отрицаю, что это полный ..., но тоже вариант )
Записан
u-gen
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #11 : Января 05, 2003, 10:14:00 pm »


2 YuriyS

А ты (Вы) случайно, не с АиТ-а? Если так, то жди(те) в гости.
Записан
Страниц: [1]
  Печать  
 
Перейти в: