多线程导致Qt中的运行时错误
Posted
技术标签:
【中文标题】多线程导致Qt中的运行时错误【英文标题】:Multi-threads cause the runtime error in Qt 【发布时间】:2018-01-12 02:14:20 【问题描述】:当我尝试在 Qt 中做多线程时,例如: 如果我像这样在另一个类中创建一个类对象:
QThread thread;
Worker worker;
worker.moveToThread(thread);
当我关闭程序时会导致运行时错误。 但是如果我像这样通过指针创建类对象:
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
不会出错。为什么我必须这样做?
并且我必须在使用后删除指针吗?如果我不这样做,那会导致内存泄漏吗?我看到很多教程都这样删除它们:
connect(worker, SIGNAL (finished()), thread, SLOT (quit()));
connect(worker, SIGNAL (finished()), worker, SLOT (deleteLater()));
connect(thread, SIGNAL (finished()), thread, SLOT (deleteLater()));
【问题讨论】:
【参考方案1】:Qt 通常管理其对象的内存。很多文档都这么说,但不是全部。
您的运行时错误是由双重删除引起的。在第一个示例中,当worker
超出范围时,它将被破坏,Qt 也会尝试delete
它。在第二个示例中,只有 Qt 会删除它,而您不会。
如果你看向Qt's own documentation of this,你会看到他们在做同样的事情:
Controller()
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
...
// notice worker was not cleaned up here, which implies moveToThread takes ownership
但是,moveToThread
's documentation isn't clear on this。
【讨论】:
以上是关于多线程导致Qt中的运行时错误的主要内容,如果未能解决你的问题,请参考以下文章
当连接类型 = Qt.DirectConnection 时,来自线程对象的 PyQt5 信号会导致段错误
cudaGraph:多线程流捕获仅在 cuda-memcheck 中运行时才会导致错误
从qt中的另一个线程运行qtconcurrent时如何关闭程序
QT QThread::isrunning 冻结程序在 Pi
由于 NSManagedObjectContextObjectsDidChangeNotification 导致的运行时错误