#207 closed баг (fixed)
QThread уничтожается до завершения работы потока
Reported by: | alx | Owned by: | dimag |
---|---|---|---|
Priority: | minor | Milestone: | 2 очередь |
Component: | ПО MC04-Dispatcher. Пульт диспетчера/техника | Keywords: | Потоки, многозадачность |
Cc: | san |
Description
Сейчас при завершении программы периодически вижу в консоли сообщение
QThread: Destroyed while thread is still running
Функция MainAppFrameWindow3::closeEvent()
посылает всем потокам сигналы quit()
, но не дожидается их реального завершения. В качестве решения предлагаю добавить в конец MainAppFrameWindow3::closeEvent()
ожидание завершения потоков:
EventThread.wait(); CommandThread.wait(); RecordsThread.wait();
Change History (6)
comment:1 by , 8 years ago
Keywords: | Потоки added |
---|
comment:2 by , 8 years ago
Keywords: | многозадачность added |
---|---|
Resolution: | → fixed |
Status: | new → closed |
comment:3 by , 8 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
А откуда следует, что вызов QThread::exit(0) будет ожидать завершения потока?
Из документации Qt:
void QThread::quit () [slot] Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0).
Таким образом, по логике, замена .quit()
на .exit(0)
ничего не меняет...
comment:4 by , 8 years ago
Могу подтвердить, что в r244 сообщение
QThread: Destroyed while thread is still running
по-прежнему выскакивает.
comment:5 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
r247
Изменил код функции MainAppFrameWindow3::closeEvent(QClose *event) на следующий
QMainWindow::closeEvent(event);
ptelephonedlg->close();
EventThread.exit(0);
CommandThread.exit(0);
RecordsThread.exit(0);
EventThread.wait();
CommandThread.wait();
RecordsThread.wait();
r244.
Я вызываю в переопределённой виртуальной функции closeEvent
следующие функции перед уничтожением объектов потоков:
EventThread.exit(0);
CommandThread.exit(0);
RecordsThread.exit(0);
что после вызова функции exit соотвествующий поток прекращает обрабатывать сообщения и выходит из функции exec потока