| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QApplication::exec + std::cin |
| Автор: borisbn 18.8.2012, 09:35 | ||||
| Здравствуйте. Хочу создать консольное приложение на Qt, которое будет в интерактивном режиме получать команды от пользователя (как python.exe, например) и обрабатывать сигналы от QtNetwork или какого-нибудь другого Qt-шного объекта. Для второго случая мне в конце main() нужно написать
а для первого нужен бесконечный цикл типа
как быть ? Спасибо. |
| Автор: mes 18.8.2012, 11:17 |
а почему бы не поместить первый во второй ? Добавлено через 1 минуту и 22 секунды точнее не сам цикл.. цикл во втором уже есть, а само чтение с потока.. |
| Автор: borisbn 18.8.2012, 11:44 |
| mes, правильно ли я понял, что можно подписаться на событие ввода данных с клавиатуры (точнее из входного потока) и не делать бесконечного цикла? Если да, то не подскажите как? Спасибо. |
| Автор: mes 18.8.2012, 12:04 | ||
по сути, exec включает в себя цикл обработки всех сообщений.. можно как подписываться на сообщение, так и просто на каждой итерации обработки делать свое черное белое дело.. Как вклиниться в цикл зависит от библиотеки.. одни имеют виртуальный метод, другие принимают функтор или фильтр.. как в Qt сейчас глянем.. Добавлено через 6 минут и 19 секунд borisbn, см. void QObject::installEventFilter ( QObject * filterObj ) |
| Автор: borisbn 21.8.2012, 09:49 |
| > см. void QObject::installEventFilter ( QObject * filterObj ) ИМХО это - не то. Какому объекту инсталлировать фильтр и какое событие ждать? |
| Автор: ecspertiza 21.8.2012, 14:04 |
| не знаю как сделать так как описывает mes, но интересно, я бы предложил создать тред для QtNetwork, должно сработать вроде как, из основного треда посылать сообщения в нетворский, а в треде вроде как есть свой event loop |
| Автор: borisbn 23.8.2012, 11:03 |
дык основного треда не будет... там вместо a.exec() будет while(true) { cin << command; } и потом, не запуская a.exec() я не смогу подписаться на события что в неворковском треде, что в QTcpSocket'е я вообще этот QtNetwork для примера привёл. Это м.б. элементарный таймер или ещё что-то в этом духе... нарооооооод... неужели никто никогда не делал консольные Qt-шные приложения с сигнал/слотами и интерактивным вводом команд от пользователя ? |
| Автор: Amp 23.8.2012, 12:23 |
| Слушай stdin через QSocketNotifier - это вроде как один из рабочих вариантов. |
| Автор: borisbn 23.8.2012, 12:54 | ||||
| Amp, спасибо. Не знал про QSocketNotifier. Но... я попробовал и у меня не заработало. Вот проект:
obj.h и другой сгенерённый код из obj.cpp я опустил. Происходит следующее: программа запускается, печатает >> и всё. Если я что-то ввожу оно не отображается (нет эха) и по Enter вообще ничего не происходит. Я пробовал запустить прокграмму так
тот же эффект. Не подскажешь, что я не так делаю ? |
| Автор: Amp 23.8.2012, 14:39 |
| Оказывается под Windows такой код работать не будет. Печально. |
| Автор: borisbn 23.8.2012, 15:05 |
| а под линух работает ? (щаз нет возможности проверить) |
| Автор: math64 23.8.2012, 15:24 |
| даже под cygwin'ом, скорее всего будет работать. |
| Автор: Amp 23.8.2012, 16:12 |
Да, в линуксе работает. |
| Автор: borisbn 23.8.2012, 18:04 |
| > Да, в линуксе работает. извини что сомневаюсь, но ты проверял или надеешься? Если первое, то Бил гей(тццц) |
| Автор: Amp 23.8.2012, 19:27 |
Проверял. |
| Автор: borisbn 23.8.2012, 19:36 |
блин |
| Автор: mes 23.8.2012, 22:02 |
инсталировать приложению, а события никакого не ждать.. при каждом событии/выове фильтра просто читать с потока.. |
| Автор: math64 24.8.2012, 08:14 |
| Дело в том, что в Linux используется один и тот же handle для файлов, консолей, сокетов и т.д., поэтому и работает. А в Windows сокеты отдельно. |