QThread连接finished信号和deleteLater函数出错

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.