我正在寻找一种解决方案来安排跨线程删除对象.关于deleteLater
表现如何的文档并不完全清楚.我可以在不是对象所有者的线程中调用此函数吗?
例如,对象X由线程A拥有,而在线程BI中则希望删除对象X. 由于此时对象可能在事件处理内部(在线程A中),因此我无法安全地删除它,直到它返回到消息循环.如果我deleteLater
从线程B 调用,但是文档似乎表明它会在线程B返回消息循环后立即删除.
目前我采取的方法是在线程A中发出一个信号,该信号连接到一个调用的插槽deleteLater
.我想知道是否有更简单的方法可以做到这一点 - 如果我确实可以deleteLater
从任何线程调用.
虽然deleteLater()
不是安全本身,你可以调用它object
的threadA
与元电话:
metaObject()->invokeMethod(object, "deleteLater", Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
然后,这将是安全的.
deleteLater()
仅意味着在处理当前事件循环(即ThreadB)中的所有信号/槽后,该对象将被删除。
因此,如果 ThreadB 中没有其他插槽需要 ObjectX,则它相当于普通的delete
.
是否可以删除该对象以及如何在 ThreadA 中处理该对象取决于您的应用程序逻辑。
如果 ObjectX 是线程的主对象,则将信号发送quit()
到 ThreadA 是可行的方法。