【发布时间】:2016-12-15 23:44:20
【问题描述】:
以下操作可以吗?
worker->moveToThread(workerthread);
...
worker->deleteLater();//this is called from main thread.
工人会被正确删除吗? 我找不到任何关于此的 Qt 文档。
【问题讨论】:
以下操作可以吗?
worker->moveToThread(workerthread);
...
worker->deleteLater();//this is called from main thread.
工人会被正确删除吗? 我找不到任何关于此的 Qt 文档。
【问题讨论】:
如果您将工作对象移动到线程,并且您希望使用信号/插槽连接与工作对象进行通信,那么 Qt 将使用在另一个线程上运行的事件循环来发送和接收信号。这就是使用 QObject::deleteLater() 背后的原因:它允许按计划、安全地删除对象,当对象的插槽之一在线程中执行时,保证不会发生这种情况。
您可以在 Qt documentation for QObject 中找到有关 deleteLater 的更多信息:
计划删除此对象。
当控制返回事件循环时,该对象将被删除。如果 调用此函数时事件循环未运行(例如 在 QCoreApplication::exec()) 之前对对象调用 deleteLater(), 一旦事件循环开始,该对象将被删除。如果 deleteLater() 在主事件循环停止后调用, 对象不会被删除。从 Qt 4.8 开始,如果 deleteLater() 被调用 在没有运行事件循环的线程中的对象上, 线程结束时对象将被销毁。
此外,在 Qt documentation for QThread 中,您可以找到 deleteLater() 的常见用例:
从 Qt 4.8 开始,可以通过将 finished() 信号连接到 QObject::deleteLater() 来释放位于刚刚结束的线程中的对象。
这个问题提供了有关 deleteLater() 适当使用的不同情况的更多详细信息:When to use deleteLater。特别是,请参阅Kuba Ober's answer。
【讨论】: