Qt deleteLater交叉线程

时间:2015-03-13 04:22:25

标签: c++ qt

可以执行以下操作吗?

worker->moveToThread(workerthread);
...
worker->deleteLater();//this is called from main thread.

工人会被正确删除吗? 我找不到任何有关此问题的Qt文档。

1 个答案:

答案 0 :(得分:2)

如果将一个worker对象移动到一个线程,并且你想要使用信号/槽连接与worker对象进行通信,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