Qt консольное приложение не завершается
Мне было интересно, как я могу запустить функцию при закрытии терминала (я нахожусь в Linux) моего консольного приложения Qt. У меня есть «статический» класс, который содержит все необходимые мне переменные (я знаю, что могу использовать синглтон, но мне так больше нравится), и у него есть функция под названием destroy, это удалит все указатели).
Итак, это мой .cpp статического класса:
А это мой main.cpp:
Как я могу позвонить engine::destroy при закрытии приложения? Я предполагаю, что для этого есть сигнал.
2 ответа
Для этого вам необходимо обработать сигнал POSIX SIGHUP .
(Примечание: сигналы POSIX полностью отличаются от сигналов Qt, поэтому они не обрабатываются с помощью «слотов». Не путайте их.)
Обратите внимание, что ваши варианты действий в обработчике сигналов POSIX очень ограничены. На странице руководства signal (7) перечислены функции, которые можно безопасно вызывать. В комментариях к этому ответу Куба Обер указал, что вам следует придерживаться официальной документации для обработка сигналов POSIX в приложениях Qt. Но поскольку процесс, описанный в документации, довольно сложен, я заключил его в многоразовый класс PosixSignalProxy , конвертирующий сигналы POSIX в сигналы Qt.
Если вы используете этот прокси-класс, вам просто нужно написать:
Обратите внимание, что для каждого типа сигнала POSIX можно создать только один экземпляр PosixSignalProxy . Если вам нужно выполнить несколько действий при получении сигнала, вы можете подключиться к сигналу Qt несколько раз.
Кроме того, вам могут быть интересны аналогичные сигналы по разным внешним причинам для выхода из приложения, например, его завершение или нажатие Ctrl + C в окне терминала.
Вот определение класса:
posixsignalproxy.h
posixsignalproxy.cpp
Вы ищете QCoreApplication::aboutToQuit , если хотите использовать сигнал.
Лучшая идея IMO состоит в том, чтобы engine не имел функций static , а правильно управлял своими ресурсами в деструкторе. Вы можете сделать его одиночным, если хотите.
Есть консольное приложение на Qt, которое запускает несколько потоков. Фактически в main я создаю классы потоков. Вопрос, где и как мне запустить деструкторы этих классов, когда я закрою окно консоли? Не могу сообразить.
Пробовал так в main:
Корректное завершение
Когда закрываю окно QGraphicsView`а, процесс остается еще запущен и пишет еще что возникла ошибка.
Корректное завершение QCoreApplication
Добрый день! OC: Windows 7 Professional Qt: 5.7.0 Есть приложение QCoreApplication: int.
Создание консольного приложения в Qt
добрый вечер ув. форумчане. собственно вот вопрос, почему окно терминала пустое после запуска.
Ошибка консольного приложения
Что это? Скриншот в вложении.
потом где-нибудь пошлете сигнал, удалите класс через делет и словите неожиданности
это бесконечный цикл, пока внутри него есть хотя ба один QObject. То есть выйти из него и удалить классы - никак, без изврата
у потока есть сигнал завершении работы, его и нужно ловить, пирмерно так
Drus, Попробовал так. окно закрывается, а сигнала finished() нет.
Наличие потока проверил, запускается нормально. странно.
Добавлено через 9 минут
Drus, Заметил еще такую вещь. У меня в одном из потоков в run() есть бесконечный цикл. Если цикл убрать то finished вызывается после окончания run, а если окно закрыть то нифига.
Можно как то еще отловить закрытие окна консольного приложения или просто его завершение?
Добавлено через 29 минут
Нашел вроде бы вариант, связать в main:
Может кто знает как с глобальной функцией например связать?
Простите что так долго не отвечал.
касательно вопроса вашего - я не подскажу так навскидку. слотосвязывание производите до того как в run отправляете? это важно.
Может быть я просто туплю, но всё же.
В конструкторе главного окна пишу первой строчкой:
Ноль реакции. Почему не завершается работа приложения ? Появляется главное окно программы.
Как завершить работу приложения ?
QT 4, студия 2008.
ты походу в начале вызываешь qApp->exit(), а уже потом exec( ) в функции маин. Если нет, то давай более подробно код.Я, конечно, теперь всё это понимаю и могу просто до вызова a.exec() в функции main() сделать
Так что тут только кривизна разработчиков QT. И только. Если экземпляр класса создан, то все его функции должны работать нормально вне зависимости от обстоятельств и доп. условий.
Добавлено 14.03.09, 11:22
доп. пример к логике моих рассуждений:
Вот ты сел в автомобиль, закрыл дверь, и тут вспомнил, что забыл что-то и хочешь выйти. А на попытку выйти тебе бортовой компьютер отвечает: "Извините, машина не заведена, Вы не можете выйти из машины". Тебе такая логика понравится ?
Вот ты сел в автомобиль, закрыл дверь, и тут вспомнил, что забыл что-то и хочешь выйти. А на попытку выйти тебе бортовой компьютер отвечает: "Извините, машина не заведена, Вы не можете выйти из машины". Тебе такая логика понравится ?Если хочешь сделать feature request, тебе сюда.
Но вообще, я себе не представляю, как в C++ можно реализовать подобное(выход из программы в обход main()). Либо ты юзаешь std::exit(), но тогда забудь о RAII, либо кидай исключение, но тогда тоже мало что хорошего выйдет, если его в main() не поймать. Как ты себе такое представляешь?
Абсолютно не согласен.
Если у меня есть непосредственный доступ к купленному автомобилю, то я могу делать с ним что угодно, например - сжечь.
Если у меня есть непосредственный доступ к экземпляру класса QApplication, то он должен корректно выполнять ВСЕ предоставляемые функции, в том числе и функцию "сдохнуть".
Если у меня есть непосредственный доступ к купленному автомобилю, то я могу делать с ним что угодно, например - сжечь.
Если у меня есть непосредственный доступ к экземпляру класса QApplication, то он должен корректно выполнять ВСЕ предоставляемые функции, в том числе и функцию "сдохнуть".
Репутация: 48
Всего: 135
Есть простенькое консольное приложение на Qt.
Подскажите, как правильно выйти из такого приложения ? Если в Windows нажать Ctrl+C или Ctrl+Break, то программа закрывается, но деструктор
Some() не вызывается. Как вообще в таком приложении отслеживать нажатия клавиш ? Допустим, я хочу, чтобы программа нормально завершалась по Esc
Желательно кроссплатформенное решение. Если же решение только системозависимое, то подскажите, пожалуйста, как это сделать в Windows и в Linux.
Спасибо.
Репутация: 24
Всего: 196
Репутация: 48
Всего: 135
С Ctrl+C справился. POSIX-сигналы, оказывается, в венде прекрасно работают
В Linux не проверял, но, думаю, там всё будет работать.
Сейчас поищу как обрабатывать клавиши
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
Репутация: 24
Всего: 196
Репутация: 48
Всего: 135
Репутация: 24
Всего: 196
Используй sig_atomic_t в качестве флага. А из программы его периодически проверяй.
Репутация: 48
Всего: 135
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.
[ Время генерации скрипта: 0.1109 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Читайте также: