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

Posted

技术标签:

【中文标题】Qt 崩溃中工作线程的删除和清理【英文标题】:deletion and cleanup of worker thread in Qt crashes 【发布时间】:2015-06-08 15:32:19 【问题描述】:

我已跟进 this link 创建工作线程(使用几乎相同的代码)。

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

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

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 信号含义:中止

当然,如果我评论这些行,我的工人析构函数将不会被调用,也不会报告任何错误。错误背后的原因是什么?如何在不出错的情况下清理工作人员?

【问题讨论】:

【参考方案1】:
QThread thread1;
MyWorker mywork1;

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

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

【讨论】:

以上是关于Qt 崩溃中工作线程的删除和清理的主要内容,如果未能解决你的问题,请参考以下文章

如何修复自定义消息框以在父 python pyqt5 的新线程中工作

QThread 移动到线程。 QThread 中的同步

工作线程如何在Nodejs中工作?

谁创建和拥有调用堆栈以及调用堆栈如何在多线程中工作?

NSData 的 -dataWithContentsOfURL: 是不是在后台线程中工作?

异步编程如何在单线程编程模型中工作?