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
только через какое-то время доходит до нашего метода и видит, что потоки уже умерли).
Самая типичная ситуация - закрытие вкладки, во время работы такой модели.
Что можно придумать, чтобы измежать такой проблемы?
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Добрый день.
Объявить QEventLoop на стеке (в объявление класса, как member), а в деструкторе модели производить его отключение. Если получится, конечно.
В любом случае какие-то действия можно будет произвести скорее всего только в деструкторе, в момент удаления экземпляра модели.
я подзабыл - try catch в деструктор помещать не считается мовитоном?
Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.