继承QTread,重写run()函数,start后不wait会报错:Destroyed while thread is still running
时间: 2024-09-27 13:11:44 浏览: 28
pyqt5 的多线程(QThread)遇到的坑(二)
在Qt中,`QThread`是一个用于创建并管理线程的工具。当你继承自`QThread`并在其中重写了`run()`函数,这个函数通常是你希望在线程里运行的具体任务。当你调用`start()`方法启动线程后,如果主线程提前销毁了该线程,而线程内部的`run()`函数还没有执行完毕,就会出现"Destroyed while thread is still running"这样的错误。
这是因为当线程开始执行,它进入了活跃状态,并且拥有对自身生命周期的控制权。如果你在主线程中终止了线程,而线程还在`run()`方法中,那么Qt无法正常地清理线程资源,导致错误发生。
为了避免这个问题,你应该在适当的时候停止线程,比如在`run()`函数结束前设置一个信号或者在`stop()`方法中。此外,还可以考虑使用`QThread::quit()`来请求线程退出,然后在`run()`函数中检查`QThread::isInterruptionRequested()`来响应这个请求。记得在主线程完成所有与线程相关的操作后再结束它,例如:
```cpp
class MyThread : public QThread {
public:
void stop() { quit(); } // 请求线程退出
protected:
void run() override {
... // 线程任务
while (!quitRequested()) { // 检查是否收到退出请求
if (shouldExit()) break; // 自定义的退出条件
}
qDebug("Thread stopped.");
}
signals:
void finished();
private:
bool shouldExit() const; // 根据需要自定义退出判断逻辑
};
// 使用示例
MyThread *thread = new MyThread();
connect(thread, &MyThread::finished, &mainWindow, []() {
delete thread;
});
thread->start();
// 主线程可以在这里等待线程完成,或者在适当时机调用stop()
...
```
阅读全文