Приложение Qt остается в памяти даже после закрытия MainWindow

Проблема в следующем: если приложение закрыто, пока оно ничего активно не делает, оно корректно завершает работу. Однако, если он активно над чем-то работает (например, ожидает в цикле while), главное окно закроется, но программа продолжит работу в фоновом режиме, что подтверждается открытием диспетчера задач.

Я потратил большую часть сегодняшнего дня на поиск проблемы и внедрение возможных исправлений, но безрезультатно. Похоже, что функция quit() просто ничего не делает. Вот некоторые вещи, которые я пробовал:

  • Использование app.connect( &app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));. Я знаю, что сигнал запущен, потому что я попытался изменить &app, SLOT(quit()) на qApp, SLOT(aboutQt()), и на короткое время появилось окно aboutQt.
  • Включая qApp->quit(); в начале функции, которая запускается с помощью кнопки главного окна. Приложение запускается на эту строку, но это не имеет никакого эффекта.
  • Используйте processEvents(), чтобы убедиться, что графический интерфейс обновляется.
  • Включая такие операторы, как mainWindow.setAttribute(Qt::WA_QuitOnClose); в main.cpp.

Я просто хочу, чтобы приложение полностью закрывалось при закрытии главного окна.

Я использую библиотеку qextserialport, если это имеет значение.


person SharpHawk    schedule 11.01.2012    source источник
comment
Является ли ваше приложение многопоточным?   -  person Lol4t0    schedule 12.01.2012
comment
Я лично не создаю темы, но я не уверен, что библиотека, которую я использую, существует. Если я открою отладчик и загляну в потоки, я увижу кучу функций ntdll!ldrFindResourceEx_U. Однако я вижу только один экземпляр моей программы в процессах диспетчера задач. PS: Почему, черт возьми, нажатие клавиши ввода отправляет сообщение вместо создания разрыва строки?   -  person SharpHawk    schedule 12.01.2012
comment
Затем ваш основной поток может подождать, пока эти потоки закончат свою работу. Это можно сделать неявно, например, деструкторы объектов могут ждать завершения потока. Вы должны изучить код своей библиотеки. PS qextserialport, насколько я знаю, темы не создает.   -  person Lol4t0    schedule 12.01.2012


Ответы (1)


Я не знаю, что не так, но поскольку ваш слот действительно получает сигнал, вы можете вызвать exit() из этой функции слота в качестве обходного пути.

person ypnos    schedule 11.01.2012
comment
Я думаю, что это плохое решение, потому что, если приложение обрабатывает что-то в другом потоке, после такого завершения TS может повредить некоторые данные. - person Lol4t0; 12.01.2012