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](/media/technical_storage/timeweb-120-90.jpg)
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!
- Liza zhegalova
- June 24, 2024, 12:40 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:70points,
- Rating points1
- Вета Миличенкова
- June 23, 2024, 6:25 p.m.
C++ - Test 001. The first program and data types
- Result:80points,
- Rating points4
![EVA](/media/cache/4b/62/4b6257bdb5dfaf404a6571a1ba7910ef.webp)
![BlinCT](/media/cache/ae/4a/ae4a65663ccbf14aec7b31a6df3f29a6.webp)
![Evgenii Legotckoi](/media/cache/5a/49/5a499b0c8eb5e79957fec0aea35e5d98.webp)
![BlinCT](/media/cache/ae/4a/ae4a65663ccbf14aec7b31a6df3f29a6.webp)
![Evgenii Legotckoi](/media/cache/5a/49/5a499b0c8eb5e79957fec0aea35e5d98.webp)
![IscanderChe](/media/cache/c6/bd/c6bd48d511a45551f81980d558b60c04.webp)
Добрый день.
Объявить QEventLoop на стеке (в объявление класса, как member), а в деструкторе модели производить его отключение. Если получится, конечно.
В любом случае какие-то действия можно будет произвести скорее всего только в деструкторе, в момент удаления экземпляра модели.
я подзабыл - try catch в деструктор помещать не считается мовитоном?
Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.