Qt崩溃时工作线程的删除和清理
deletion and cleanup of worker thread in Qt crashes
我已经按照这个链接创建了一个工作线程(使用几乎相同的代码)。
我在代码末尾遇到一个错误,在worker完成后执行清理,并发出finished信号。
如果我将线程和工作线程声明为指针,就没有问题(就像链接一样)。但是如果我像下面这样声明它们,我的程序将在调用析构函数后崩溃!!
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信号含义:Aborted
当然,如果我注释了这些行,我的工人析构函数将不会被调用,也不会报告错误。错误背后的原因是什么?如何在不出现错误的情况下清除worker ?
QThread thread1;
MyWorker mywork1;
这些是在堆栈上创建的,当它们超出作用域时将被删除。您需要动态地创建它们(使用new),如果稍后要删除它们
QThread* thread1 = new QThread;
MyWorker* mywork1 = new MyWorker;
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++中的线程安全删除
- 线程调用的函数对对象删除是否安全?
- 删除原子多线程代码中的容器
- C++ 线程创建/删除与线程停止/恢复
- 从矢量中删除已完成的线程
- 完全删除 QApplication 实例并在另一个线程中重新创建它
- 在 DTor 之前删除的静态对象创建的线程?
- 线程池 - 如何在成员线程完成后删除工作线程(此)
- C++多线程程序尝试使用已删除的函数
- C 线程:尝试使用已删除的函数
- 如何安全地删除ATL DLL中的std ::线程
- 从另一个线程中删除对齐的内存
- 删除boost ::线程后代
- boost ::线程在删除可加入线程时存在什么问题
- 删除线程时崩溃
- 从多线程程序中安全地删除对象
- C++线程和Promise:试图引用已删除的函数
- 在将对象移动到另一个线程后,不能简单地删除该对象
- Boost::线程:从动态组中删除线程