我已经跟进了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信号含义:已中止
当然如果我评论这些行,我的工作者析构函数将不会被调用,并且不会报告错误。错误背后的原因是什么?如何在不收到错误的情况下清理工作者?
答案 0 :(得分:3)
QThread thread1;
MyWorker mywork1;
这些是在堆栈上创建的,当它们超出范围时将被删除。如果您稍后要删除
,则需要动态创建它们(使用新的)QThread* thread1 = new QThread;
MyWorker* mywork1 = new MyWorker;