何时或如何在Qt中删除QThread

Jer*_*rry 4 windows qt multithreading

我从这里找到了这个QThread示例。与子类化QThread相比,建议使用QObject和QThread。

class Worker : public QObject
{
   Q_OBJECT

public slots:
    void doWork() {
        /* ... */
    }
};

QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
thread->start();
QMetaObject::invokeMethod(worker, "doWork", Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是何时以及如何删除线程?

我试图将完成连接到2个插槽,myTest和deleteLater。我在myTest中设置了一个断点,但从未触发过此断点。因此,我怀疑没有完成的信号,这意味着该线程不会被删除。

connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), this, SLOT(myTest()));
Run Code Online (Sandbox Code Playgroud)

对于辅助对象,我发出一个完成的信号作为doWork中的最后一条指令,并将其连接到可以删除该辅助对象的插槽中。这是正确的方法吗?

Qt版本:4.6.2

Rez*_*imi 6

当线程的worker方法执行完成时,线程会正常退出,但是如果您想在线程退出时间内做一些事情,请使用finished()信号,可以通过将finished()信号连接到来释放生活在刚刚结束的线程中的对象QObject::deleteLater()

connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
Run Code Online (Sandbox Code Playgroud)