был вызван qApp->quit()
реализую следующее:
1. отлов сигнала SIGTERM и вызова в нём qApp->quit()
2. тяжелый цикл в котором я могу переодически вызывать qApp->processEvents() и опрашивать qApp что он ещё живой
как сделать сие без использования глобальной булевой переменной которую предётся тащить во все тяжелые модули обработки?
Сигнал aboutToQuit() есть.
да. это именно сигнал. а мне нужна функция которую я сам вызову
Есть ещё closingDown(), но я не уверен, что это подходит.
А что не так с сигналом? Если нужен блокирующий коллбэк, то можно DirectConnection заюзать.
У меня оно так работает
за наводку спасибо. сейчас опробую. хотя тут до разрушения qApp далеко, но вдруг сработает.
У QObject есть property/setProperty, по сигналу можете попробовать добавить своё property в qcoreapplication, а по месту его проверять.
я внутри тяжелого цикла. только в этом загвоздка. а так да, нормальное решение. я и сам так делаю для гуишечек
:) ну в принципе да. раз не хочу переменную, то спрятать её в существующую глобальную. спасибо за идею!
а qApp->processEvents() в теле цикла вызывается несколько раз, или в конце?
ну как-то некрасиво получается просто. 1. придётся делать класс QObject c его слотсигналами (идеалогия-то хорошая, но тут у меня просто функция с толстенным обработчиком) 2. в слоте опять заводить флаг завершения и слот его взведения в каждом классе обработчике. проще тогда флаг протащить. да . это всё рабочие решения. но я думал что есть что-то готовое чтоб не тащить ровно один глобальный флаг сквозь всю программу
много раз внутри цикла
Так а изначально для чего такой флаг завершения понадобился?
корректно прервать цикл
Цикл в каком-то другом потоке?
qApp не должен стать nullptr после этого разве?
С чего ради? Это ж синглтон.
и что, что синглтон? синглтон не может быть nullptr по-твоему?
Нет, не может, почитай как он устроен.
Тогда дай разработчикам Qt почитать заодно, потому что они очищают QCoreApplication::self, который выдается по QCoreApplication::instance(), к которому ведет макрос qApp https://github.com/qt/qtbase/blob/dev/src/corelib/kernel/qcoreapplication.cpp#L884
нет конечно. quit всего лишь завершает цикл обработки событий. если бы он делал делит, то у всех программа крашилась бы при завершении. т.к. Q(Core)Application выделена на стеке в функции main ЗЫ. по итогу сделал через глобальную переменную. хоть и не красиво, но другого не придумал
set_exit_handler(int sig) { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = daemon_exit_handler; if( sigaction(sig, &sa, nullptr) != 0 ) daemon_error_exit("Can't set daemon_exit_handler for sig:%d : %m\n", sig); }
Обсуждают сегодня