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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Добрый день.
Объявить QEventLoop на стеке (в объявление класса, как member), а в деструкторе модели производить его отключение. Если получится, конечно.
В любом случае какие-то действия можно будет произвести скорее всего только в деструкторе, в момент удаления экземпляра модели.
я подзабыл - try catch в деструктор помещать не считается мовитоном?
Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.