跨越QThread的QObject :: deleteLater

edA*_*a-y 8 c++ qt

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

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

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

Til*_*gel 10

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

如果您想完全依赖记录的行为,请使用QObject.


Lol*_*4t0 7

虽然deleteLater()不是安全本身,你可以调用它objectthreadA与元电话:

metaObject()->invokeMethod(object, "deleteLater", Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)

然后,这将是安全的.


Chr*_*wet 0

deleteLater()仅意味着在处理当前事件循环(即ThreadB)中的所有信号/槽后,该对象将被删除。

因此,如果 ThreadB 中没有其他插槽需要 ObjectX,则它相当于普通的delete.

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

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