LINUX.ORG.RU

Слежение за клавиатурой


0

0

Привет.
Нужно - "ловить" пользовательский ввод в то время, пока отрабатывает другой код.
Т.е. к примеру есть цикл, в конце каждого шага мы проверяем, не ввел ли пользователь чего, пока мы там исполнялись.
В консоли, на С, кроме гцц-шных либ ничего не подключать.
Мыслей - ноль.
...
Да, нуб.
Гугл не помог, нет.

Ответ на: комментарий от anonymous

Возможно, но...
Если пользователь ввел больше одного символа (цикл отрабатывает полсекунды, но вдруг у нас очень нервный пользователь, а обработать надо всё). Возможно, стоит отбрасывать всё, кроме последнего, по-идее это должно работать правильно.
Ещё вариант, предпочтительный - сразу же по вводу перезапускать цикл (в начале стоит свич от символа этого самого), но тут я вообще хз, потому что цикл рвать нельзя (там вывод, он должен всегда отрабатывать), а иначе мы можем получить очередь, т.е. несколько необработанных символов...
Плюс, пример по порокам бы, я не сталкивался с ними =/
или статью какую.
*ушел за к&р-овской книжкой*

rebarned
() автор топика
Ответ на: комментарий от rebarned

Оказывается, я дурак.
Потому что, к примеру, нажатия стрелок тоже надо ловить, а это - совсем не символы.
И да, в к&р по потокам ни слова.
...
Замешательство О.о

rebarned
() автор топика

man pthreads

делается это так: в одном потоке ловим нажатия клавиш, в другом работаем "другим кодом".

еще сразу рекомендую посмотреть на мьютексы - как распланировать взаимодействие

generatorglukoff ★★
()
Ответ на: комментарий от generatorglukoff

Спасибо, гляну.
Вот только проблема в том, что это не билт-ин штука, ну да ладно.
Под винду порт есть вроде...
Да, кроссплатформенность обязательна.
...
И да, а как ловить нажатия? Т.е. к примеру получать кейкод нажатой клавиши

rebarned
() автор топика
Ответ на: комментарий от rebarned

> Плюс, пример по порокам бы, я не сталкивался с ними =/ или статью какую.

По порокам? Рекомендую сначала прочитать короткое howto "7 смертных грехов". Потом можно переходить к более объёмной статье "Ветхий завет".

gaa ★★
()
Ответ на: комментарий от gaa

Чертов т9.
...
Условие - чистый Си же, без левых библиотек, только билт-ин компилятора.
Потоки - ладно, но блин, курсы - это жесткий чит, тогда и вывод можно на них писать, бо это легче гораздо.
Но вся фишка в том, чтоб без них.

rebarned
() автор топика
Ответ на: комментарий от rebarned

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

Тебе написать или потрахаццо? Если потрахаццо, то ничем помочь не могу.

gaa ★★
()
Ответ на: комментарий от generatorglukoff

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

rebarned
() автор топика
Ответ на: комментарий от rebarned

> Блин, как раньше без курсов писали?

25 лет назад? Тогда эскейп-последовательности конкретного терминала писали ручками, так же и считывали. Можешь откопать какую-нибудь старую книжку по си и юниксу, там в конце обычно табличка управляющих кодов была.

gaa ★★
()
Ответ на: комментарий от rebarned

>Оно вроде тоже только символ считывает из потока

так а в чём пробема? два потока управления, в одном бесконечно считываем коды нажатых клавиш и набираем из них очередь, в другом раз в какой-то промежуток эту очередь потребляем и очищаем. обращение к очереди должно быть залочено, момент вычитки надо обрабатывать особо

работа с потоками в C/C++ не стандартизована, а потому системозависима; но pthreads имеют реализацию и под оффтопик, да

jtootf ★★★★★
()
Ответ на: комментарий от rebarned

int a;
a = getch();
if (a == 0 || a == 224){
	a = getch();
	printf("%d", a);
}

работает верно. олл хайл гугл.
но вообще это ой.

теперь курю треды.

rebarned
() автор топика
Ответ на: комментарий от rebarned

>Символа. Не кейкода

>стрелку не ловит =/

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Ну я имел в виду, что у стрелки нет символа и поймать мы так её не сможем.
Оказалось, что ошибался. Но способ... неочевидный =D

rebarned
() автор топика
Ответ на: комментарий от rebarned

да, собственно первый пример был написан под влиянием гинираторного man getc.

rebarned
() автор топика

А можно сделать это без нитей?
Используя асинхронный в/в и обрабатывая сигнал SIGIO?

---
Я не в теме, просто мысль пришла :)

anonymous
()

Стрелки можно ловить как обычные символы, man stty (это из консоли, и из С тоже можно).

Но думаю совсем кроссплатформенно это не сделать, под винды нужно чуток по-другому клавиши читать

// www_linux_org_ru

anonymous
()

можно посмотреть, как сделано в SDL

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.