2013-08-29 26 views
1

我知道从插槽处理中删除QObject可能会导致应用程序崩溃,因为它可能有其他排队事件。 因此,而不是使用“delete obj”,我将使用obj-> deleteLater()。据我所知,obj等待处理所有排队的事件,然后“删除obj”。在信号/插槽处理过程中删除QObject

的QObject ::〜QObject的() 所有信号并从该对象被自动断开,以及用于该对象的任何待决投递事件从事件队列中删除。但是,使用deleteLater()而不是直接删除QObject子类通常更安全。

但是,关于其他信号/插槽过程呢?我的意思是,如果你已经连接了与Qt :: QueuedConnection或Qt :: BlockingQueuedConnection不同的线程中的信号/插槽。他们是否出列进行处理?

在此先感谢。

回答

1

deleteLater将从对象所属的线程中移除对象。 Qt::QueuedConnectionQt::BlockingQueuedConnection(也是Qt::AutoConnection)以这种方式工作,该槽是从具有槽的对象属于的线程的事件循环中调用的。
因此,如果您添加到您发布的此报价,这意味着任何待处理的Qt::*QueuedConnection将在对象被破坏时自动解除。这意味着您在使用这些连接时很安全,并且deleteLater。当您将Qt::DirectConnection与不同的线程一起使用,或者当您尝试从错误的线程直接销毁对象(delete pointer;)时,可能会出现问题。

+0

是那些允许你说'delete obj;'而不是'obj-> deleteLater();'的唯一要求吗?线程间的'Qt :: DirectConnection'和删除都是你永远不应该做的事情,那么“它通常更安全”是什么意思。 QT在什么情况下给了我们什么样的保证? –

+0

问题只有在出现多线程问题时才会出现。如果所有的方法都是从正确的线程中调用的,那么所有的方法都应该可以工作。有一个例外:悬挂指针(但这适用于所有C++/C框架,应始终避免)。如果某些方法是在不同的线程中进行的,那么在销毁期间,您应该确保此任务已完成。如果您需要更多详细信息,请询问一般问题。 –

+0

我的问题是:什么内部qt的工作可能需要你使用'deleteLater'而不是'delete'?我知道所有常见的多线程问题,并且同步访问的必要性也需要同步化销毁。但是我不能使用同步原语,即信号/时隙机制,我可以吗?顺便说一句,在同一个对象上调用不同线程的不同方法仍然可能会失败,即使你使用deleteLater来删除它,所以这里超出了范围。 –