【问题标题】:Qt deleteLater cross threads [duplicate]Qt deleteLater跨线程[重复]
【发布时间】:2016-12-15 23:44:20
【问题描述】:

以下操作可以吗?

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

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    如果您将工作对象移动到线程,并且您希望使用信号/插槽连接与工作对象进行通信,那么 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多