Opened 8 years ago

Closed 8 years ago

Last modified 7 years ago

#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 dimag, 8 years ago

Keywords: Потоки added

comment:2 by dimag, 8 years ago

Keywords: многозадачность added
Resolution: fixed
Status: newclosed

r244.
Я вызываю в переопределённой виртуальной функции closeEvent
следующие функции перед уничтожением объектов потоков:
EventThread.exit(0);
CommandThread.exit(0);
RecordsThread.exit(0);
что после вызова функции exit соотвествующий поток прекращает обрабатывать сообщения и выходит из функции exec потока

comment:3 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

А откуда следует, что вызов 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 alx, 8 years ago

Могу подтвердить, что в r244 сообщение

QThread: Destroyed while thread is still running

по-прежнему выскакивает.

comment:5 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

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();

comment:6 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.