QEventLoop тормозит при удалении экземпляра
Привет. Я писал когда-то такой метод в главной модели проекта:
void TreeModel::waitIfBusy() { if(busy()) waitingFor(this, &TreeModel::busyChanged); } template<class TObj, class TSignal> void TreeModel::waitingFor(TObj &&obj, TSignal &&signal) { QEventLoop loop; connect(obj, signal, &loop, &QEventLoop::quit); loop.exec(); }
Применение простое. Вызываем у экземпляра модели просто
waitIfBusy()
и приложение стопится, пока эта модель не перейдет в положение "свободна".
Проблема: если экземпляр модели умирает во время выполнения этого метода и, соответственно, всех текущих сервисов и их потоков, то
eventloop
куксится, выдааёт предупреждение и это вызывает задержку (так как
evenloop
только через какое-то время доходит до нашего метода и видит, что потоки уже умерли).
Самая типичная ситуация - закрытие вкладки, во время работы такой модели.
Что можно придумать, чтобы измежать такой проблемы?
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Ora Iro
- Жел. 24, 2024, 6:38 Т.Ж.
C++ - Тест 001. Первая программа и типы данных
- Нәтиже:40ұпай,
- Бағалау ұпайлары-8
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
Добрый день.
Объявить QEventLoop на стеке (в объявление класса, как member), а в деструкторе модели производить его отключение. Если получится, конечно.
В любом случае какие-то действия можно будет произвести скорее всего только в деструкторе, в момент удаления экземпляра модели.
я подзабыл - try catch в деструктор помещать не считается мовитоном?
Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.