/! put the following code in constructor
QThread *thread = new QThread;
//! type of m_weakThread is QWeakPointer<QThread>
m_weakThread = thread;
Worker *worker = new Worker;
//! type of m_weakWorker is QWeakPointer<Worker>
m_weakWorker = worker;
worker->moveToThread(thread);
connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
connect(thread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
//! instead of finished() signal, connect destroyed() signal to thread's quit() slot
connect(worker, SIGNAL(destroyed()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
//! put the following code in destructor
if (!m_weakThread.isNull()) {
QThread *thread = m_weakThread.data();
if (thread->isRunning()) {
thread->quit();
thread->wait();
}
}
if (!m_weakWorker.isNull()) {
Worker *worker = m_weakWorker.data();
m_weakWorker.clear(); //! optional, a little optimization
//! it's safe to release worker since the secondary thread exits
delete worker;
}
if (!m_weakThread.isNull()) {
QThread *thread = m_weakThread.data();
m_weakThread.clear();
//! it's safe to release thread since it exits and all objects in it has released
delete thread;
}