跨越QThread的QObject :: deleteLater

时间:2012-03-09 11:05:30

标签: c++ qt

我正在寻找一种解决方案来安排跨线程删除对象。关于deleteLater行为的文档并不完全清楚。我可以在不是对象所有者的线程中调用此函数吗?

例如,对象X由线程A拥有,而在线程B中,我希望删除对象X.由于此时对象可能在事件处理内部(在线程A中),因此我无法安全地删除它,直到它返回到消息循环。如果我从线程B中调用deleteLater,那么文档似乎表明它会在线程B返回到消息循环后立即删除。

目前我采取的方法是在线程A中发出一个信号,该信号附加到一个调用deleteLater的插槽中。我想知道是否有更简单的方法可以做到这一点 - 如果我确实可以从任何线程中调用deleteLater

3 个答案:

答案 0 :(得分:6)

虽然deleteLater()本身并不安全,但您可以使用元调用在object的{​​{1}}中调用它:

threadA

然后,这将是安全的。

答案 1 :(得分:6)

查看Qt 4 codeQt 5 codedeleteLater()只调用显式声明为线程安全的QCoreApplication::postEvent()。所以,直接调用它应该没问题。当事件队列在对象的所有者线程中处理时,删除将发生在线程A中。

如果您想完全依赖记录的行为,只需使用postEvent()

答案 2 :(得分:0)

deleteLater()仅表示在处理了当前事件循环(即ThreadB)中的所有信号/槽之后将删除该对象。

因此,如果ThreadB中没有其他插槽需要ObjectX,则它等同于普通delete

您是否可以删除对象以及如何在ThreadA中处理它取决于您的应用程序逻辑。

如果ObjectX是线程的主要对象,那么将quit()信号发送给ThreadA是可行的方法。