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 的新线程中工作