![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Здравствуйте. Никогда не сталкивался ранее с подобной проблемой для консольного приложения. Нужно отработать в потоке нажатие клавиши, потоки у меня boost::thread. Желательно кросс-платформенно отработать событие, но если такого варианта нет, тогда можно под винду.
Спасибо. |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
fgetc(stdin) ? Или нужны сканкоды ?
|
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
вот этот код:
не отрабатывает событие. Что-то не так или fgetc как раз таки использовать нельзя... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
именно нажатие.
|
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Для винды решил следующим образом.
Но когда хотя бы один поток запущен - сразу перестаёт работать. Не знаете, в чем дело? Запихать отработку события в поток тоже не помогает. Это сообщение отредактировал(а) comcon1 - 4.7.2008, 16:36 |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
comcon1, читайте в MSDN про AttachThreadInput
-------------------- СУВ, Partizan. |
|||
|
||||
| pan2004 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
Добавлено через 8 минут и 9 секунд
Не работает, потому что когда до твоего цикла с ReadConsoleInput доходит управление(и если), поток уже завершил свою работу. Помести thread.join() в конец программы, где ему и место. |
||||
|
|||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
Кусок из моей программы:
Этот код делает примерно то же самое, что желает comcon1, только второй поток в моем случае не обрабатывает событие, а ждет ввода пользователя, который затем направляется в основной поток. Кроме того, здесь ожидается ввод строки, а не нажатие клавиши, но это несущественное отличие.
|
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
В файле conio.h есть функция kbhit() , которая должна проверять нажатую клавишу. Кроме того, не блокирует работу программы - нет нажатой клавиши, просто возвращает 0, так что можно обойтись без дополнительных потоков. Встретил такой кусок в одной проге:
Функция есть по крайней мере в gcc, компиляторах от Борланда и Микрософт. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ты сильно заблуждаешься. Во-первых, в компиляторе вообще функций нет, они есть в библиотеках. Во-вторых, в стандарт не входит ни conio.h, ни kbhit(). В-третьих, под GNU/Linux, например, ничего похожего на kbhit в стандартной библиотеке нет. |
|||
|
||||
| pan2004 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
Придираемся к словам, да?
Ну тут я действительно несколько ошибся - посмотрел, что в MinGW такая функция (kbhit) есть. Есть она, судя по этому и в двух остальных компиляторах. То, что дела с conio.h в gcc(в общем) обстоят несколько иначе, чем в MinGW, я предположить не смог PS Вот эмуляция kbhit и еще некоторых функций под линух, рабочая или нет, сказать не могу:
Это сообщение отредактировал(а) pan2004 - 6.7.2008, 14:21 |
||||||
|
|||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет ни в одном стандарте. Есть функции для работы с консолью в WinAPI и ncurses/slang под Unix-like-системы. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
всем большое спасибо. Сделал пока чисто в API-вызовах, буст выкинул нах.
Остался вопрос иного рода: у меня почему-то периодически одно нажатие клавиши срабатывает 2 раза... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Ладно, всем спасибо. Решил пока проблему вставкой Sleep(100) после считывания события, но это костыль, поэтому тему закрывать не буду.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |