LINUX.ORG.RU

Qt не знает события выхода из системы (пруф видео прилагаю). Как корректно закрыть программу?

 


0

1

В моем проекте MyTetra есть застарелый баг: иногда невозможен выход из системы (KDE4), если работает MyTetra. При этом выводится сообщение что MyTetra заблокировала выход из системы. Для выхода приходится вручную закрыть программу MyTetra, после чего можно выйти.

Это могло бы происходить из-за открытых файлов. Но в MyTetra специально сделано так, что все файлы всегда держатся закрытыми. Открываются на запись только при изменении и снова закрываются. Однако в MyTetra используется QtSingleApplication, и сдается мне, что именно эта обертка держит открытыми какие-то свои файлы, и из-за нее нельзя иногда выйти из системы (закономерность до сих пор не ясна, strace показывает только на файлы в /tmp, создаваемые не моим кодом).

Самый очевидный путь решения проблемы - выходить из MyTetra при обнаружении выхода из Иксов или выхода из DE. Однако, я не могу отследить это событие. Такое впечатление, что его просто нет. Я делаю логирование всех событий (отладочный вывод в eventFilter() главного окна). И при действиях с панелью (нажатие на кнопку K-меню), и даже при выходе из KDE4, в MyTetra никаких событий не прилетает.

Видео (10 Мб): http://rghost.ru/58633355

Вопрос: как обнаружить выход из DE или из Иксов, чтобы корректно завершить приложение?

★★★★★

Бланшет, Саммерфилд. Qt4 программирование на GUI на языке C++ | Глава 23 | Управление сеансами в системе X11

Попробуй как там написано.

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

Странно, но у меня в этой книге последняя глава 21.

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

Качни с рутрекера актуальное издание (2ed).

EXL ★★★★★ ()

как обнаружить выход из DE или из Иксов, чтобы корректно завершить приложение?

если DE/WM умеет в xsession - то через него. но это не гарантируется. поэтому гораздо надежнее сохранять сеанс сразу при его изменении.

также, когда ты делаешь ctrl+alt+backspace — никакой xsession не отрабатывает.

но главное, не связывайся со всякими там SIGTERM/SIGKILL — потратишь только время зря.

гуи-тулкит теряет соединение с иксами, и дергает exit. это может произойти прямо в процессе записи конфига в обработчике. если у тебя запись атомарная — то останется старый конфиг. если не атомарная — конфиг испортится. врядли тебе надо что-то из этого. во всяком случае, такое происходит с GTK, возможно в Qt как-то иначе.

upd: блин, я неправильно понял твою проблему. у тебя просто прога блочит завершение DE. это вообще что-то из другой оперы, и я не знаю как это ловить. ищи что именно вызывает блокировку. сорри за ненужную инфу.

waker ★★★★★ ()
Последнее исправление: waker (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.