我正在寻找一种解决方案来安排跨线程删除对象。关于 deleteLater
行为方式的文档并不完全清楚。我可以在不是对象所有者的线程中调用此函数吗?
例如,对象 X 由线程 A 拥有,而在线程 B 中我想删除对象 X。由于该对象目前可能在事件处理中(在线程 A 中),在它返回消息循环之前我无法安全地删除它。如果我从线程 B 调用 deleteLater
但是文档似乎表明它会在线程 B 返回消息循环后立即删除。
目前我采用的方法是在线程 A 中发出一个信号,该信号附加到调用 deleteLater
的插槽。我想知道是否有更简单的方法来执行此操作 - 如果确实可以从任何线程调用 deleteLater
。
最佳答案
查看 Qt 4 code和 Qt 5 code ,deleteLater()
只是调用明确声明为线程安全的QCoreApplication::postEvent()
。所以,直接调用它应该没问题。由于事件队列是在对象的所有者线程中处理的,因此删除将发生在线程 A 中。
仅 Qt 5 QObject
documentation明确地将 deleteLater()
列为线程安全的。如果您想完全依赖 Qt 4 中记录的行为,请使用 postEvent()
。
关于c++ - QObject::deleteLater 跨 QThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632989/