【问题标题】:deletion and cleanup of worker thread in Qt crashesQt 崩溃中工作线程的删除和清理
【发布时间】: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 信号含义:中止

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

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案1】:
    QThread thread1;
    MyWorker mywork1;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多