Как правильно завершить QThread в Qt?

Это правильный способ завершить поток...

 if(m_ReviewImageThreadLoader !=NULL)
 {
   m_ReviewImageThreadLoader->quit();
   m_ReviewImageThreadLoader->wait();
   m_ReviewImageThreadLoader->terminate();
   delete m_ReviewImageThreadLoader;
   m_ReviewImageThreadLoader = NULL;
   qDebug()<<"m_ReviewImageThreadLoader closed"<<endl;
 }

... где m_ReviewImageThreadLoader — объект потока.


person Govind Rao    schedule 30.06.2016    source источник


Ответы (1)


Ответ на ваш вопрос во многом зависит от характера работы, проводимой над вашей веткой. Если использование что-то вроде...

QThread *m_ReviewImageThreadLoader = new QThread;
MyObject *mo = new MyObject;
mo->moveToThread(m_ReviewImageThreadLoader);
m_ReviewImageThreadLoader->start();

тогда ваш код должен быть в порядке (хотя вам действительно не нужен вызов terminate()).

Если, с другой стороны, тип m_ReviewImageThreadLoader является производным от QThread и явно переопределяет QThread::run, вам потребуется предоставить дополнительную информацию, прежде чем на ваш вопрос можно будет ответить.

Вы пробовали свой код? Похоже, это работает?

person G.M.    schedule 30.06.2016
comment
Привет, ГМ! Спасибо за ответ. Я создал свой объект следующим образом: m_ReviewImageThreadLoader = new ReviewImageThreadLoader(); m_ReviewImageThreadLoader сам наследуется Qthread и m_ReviewImageThreadLoader, нет необходимости создавать новый класс для этого. Если вы используете такой поток, теперь я хочу удалить поток. Я прошу процесс для удаления потока. в этом случае этот код будет работать нормально - person Govind Rao; 30.06.2016
comment
if(m_ReviewImageThreadLoader !=NULL) { m_ReviewImageThreadLoader-›quit(); m_ReviewImageThreadLoader-›terminate(); удалить m_ReviewImageThreadLoader; m_ReviewImageThreadLoader = NULL; qDebug()‹‹m_ReviewImageThreadLoader закрыт‹‹endl; } - person Govind Rao; 30.06.2016