MyThread继承QThread,并实例化一个MyThread对象m.连接m的finished信号和deleteLater信号。
connect(m,SIGNAL(finished()),m,SLOT(deleteLater));
但是当我调用m->terminate();函数时,程序会崩溃。
如果采用队列连接的方式
connect(m,SIGNAL(finished()),m,SLOT(deleteLater),Qt::QueuedConnection);
这样就不会出错。
哪位大神知道这是为什么
/! 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;
}
先看看你出错的地方,分析一下
If the associated thread was terminated using terminate(), it is undefined from which thread this signal is emitted.