Qt崩溃时工作线程的删除和清理

deletion and cleanup of worker thread in Qt crashes

本文关键字:删除 线程 崩溃 工作 Qt      更新时间:2023-10-16

我已经按照这个链接创建了一个工作线程(使用几乎相同的代码)。

我在代码末尾遇到一个错误,在worker完成后执行清理,并发出finished信号。

如果我将线程和工作线程声明为指针,就没有问题(就像链接一样)。但是如果我像下面这样声明它们,我的程序将在调用析构函数后崩溃!!

QThread thread1;
MyWorker mywork1;
mywork1.moveToThread(&thread1);
QObject::connect(&thread1, SIGNAL(started()), &mywork1, SLOT(process()) );
QObject::connect(&mywork1, SIGNAL(finished()), &thread1, SLOT(quit()));
QObject::connect(&mywork1, SIGNAL(finished()), &mywork1, SLOT(deleteLater()));//****
QObject::connect(&thread1, SIGNAL(finished()), &thread1, SLOT(deleteLater()));//****

问题是由标记为//****的行引起的报告的错误信息如下:下级停止是因为它收到了来自操作系统的信号。信号名称:SIGABRT信号含义:Aborted

当然,如果我注释了这些行,我的工人析构函数将不会被调用,也不会报告错误。错误背后的原因是什么?如何在不出现错误的情况下清除worker ?

QThread thread1;
MyWorker mywork1;

这些是在堆栈上创建的,当它们超出作用域时将被删除。您需要动态地创建它们(使用new),如果稍后要删除它们

QThread* thread1 = new QThread;
MyWorker* mywork1 = new MyWorker;