LINUX.ORG.RU

[Qt] QApplication & fork

 


0

2

Есть желание форкнуться когда QApplication.exec() уже сделан. Естественно, на втором-третьем форке всё закономерно грохается в дебрях xlib.

Вопрос: существует ли возможность остановить QApplication без завершения программы - т.е. что-то типа QApplication::quit() но без exit(0). Или хотябы полностью заморозить весь Qt'шный event loop вместе отрисовкой и опросом X11, дабы под ногами не путался.

★★★
Ответ на: комментарий от Darkman

Но остается проблема - при quit QApplication явно высвобождает иксовые ресурсы - в первую очередь окна, и родитель обламывается, т.к. потомок всё уже подчистил.

Как ему просто сказать чтобы он заткнулся, но ничего за собой ни чистил и не освобождал ? Т.е. надо просто остановить намертво его event loop.

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

А может, лучше обычную многопоточность через QThread сделать? Всё же с такой библитекой, как Qt, лучше всё по докумментации делать, а то потом проблемы могут быть.

anonymous
()
Ответ на: комментарий от trex6

> QThread уже советовали?

Непойдёт. Нужен именно форк. Т.к. нужен sandbox, который может вполне себе грохнуться по SEGV или уйти в D-state, и прийдётся запускать новый.

Можно, конечно, компилять его в отдельный процесс. Но неужели нет внятного способа форкнуться из-под QApplication ?

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

Можно не компилять отдельный бинарник, а запускать самого себя со специальными параметрам командной строки. Структуры данных, которые нужны дочернему процессу, можно запихнуть в shared memory.

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

Вопрос закрыт.

Форкаемся, затем:

В C++ решается перекрытием QApplication::x11EventFilter, который в потомке всегда возвращает true.

В Ruby - строкой: 'Qt::Internal.application_terminated = true' в потомке.

И там и там в потомке ручками надо остановить все QTimer и QThread.

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

Пожалуйста, не надо так делать в серьёзных программах, это очень криво. Нет гарантии, что это будет работать с другой версией Qt.

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

> Нет гарантии, что это будет работать с другой версией Qt.

С какого это перепуга ? Поведение x11EventFilter описано в официальной доке, и то что я предложил, согласно ей же отрежет для main event loop доступ к событиям X11.

В случае же с Qt::Internal - это быстрое решение, которое если перестанет работать решается

а) перекрытием Qt::Application.exec

б) бинарным расширением работающим через тот же x11EventFilter

Darkman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.