我已经跟进this link创建工作线程(使用几乎相同的代码)。
我在代码末尾遇到错误,该错误在完成工作程序并发出完成的信号之后执行清除。
如果我将线程和worker声明为指针,就没有问题(就像链接一样)。但是,如果我像下面这样声明它们,则在调用析构函数后,我的程序将崩溃!
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信号含义:已中止
当然,如果我评论这些行,则不会调用我的工人析构函数,也不会报告任何错误。错误背后的原因是什么?如何清除工作程序而不会出现错误?
最佳答案
QThread thread1;
MyWorker mywork1;
它们在堆栈上创建,超出范围将被删除。如果以后要删除它们,则需要动态创建它们(使用新的)。
QThread* thread1 = new QThread;
MyWorker* mywork1 = new MyWorker;