不建议在线程主函数里直接调用delete或deleteLater,因为这可能会导致一些不可预知的问题。在主线程中删除QThread对象比较安全,可以通过信号和槽机制来实现:
在主线程中定义一个槽函数,用于接收QThread对象发送的finished()信号。
在创建QThread对象时,将它的finished()信号连接到上述槽函数。
当QThread执行完毕后,会自动发出finished()信号,在槽函数中调用deleteLater()来删除该QThread对象。
示例代码如下:
class MyWorker : public QObject {
Q_OBJECT
public slots:
void doWork() {
// 执行耗时操作
emit workFinished();
}
signals:
void workFinished();
};
class MyThread : public QThread {
Q_OBJECT
public:
void run() override {
MyWorker worker;
connect(&worker, &MyWorker::workFinished, this, &MyThread::onWorkFinished);
worker.doWork();
}
signals:
void finished(MyThread* thread);
private slots:
void onWorkFinished() {
emit finished(this);
}
};
// 主线程中的代码:
void testMainThreadDelete()
{
MyThread* thread = new MyThread;
connect(thread, &MyThread::finished, thread, &MyThread::deleteLater); // 连接finished信号到deleteLater槽函数
thread->start(); // 启动子线程
}
上面示例代码演示了在主线程中如何创建一个子线程对象,并在子线程执行完毕后自动删除该对象。在MyThread类的finished信号中,我们连接了它的deleteLater槽函数,这样当子线程执行完毕后会自动发送finished信号并触发该槽函数从而删除该对象。