deleteLater()是否等待交付所有挂起的信号?

时间:2013-11-08 16:12:47

标签: c++ qt

我在考虑编写这段代码:

emit finished();
deleteLater();

但它让我想知道在删除对象之前是否总会传递finished()。我非常肯定会为Qt::DirectConnection提供,但我不确定Qt::QueuedConnection,或者插槽是否在另一个帖子中。

1 个答案:

答案 0 :(得分:2)

当您发出信号时,它会被放置在接收对象的线程的事件队列中以进行处理。调用deleteLater还会向队列添加一个事件,因此如果接收对象和被删除的对象具有相同的线程关联,则无论线程类型如何,它们都将按顺序执行。

如果发送方和接收方具有不同的线程关联(在不同的线程中运行),那么我认为如果接收方的事件循环在发送方的事件循环之前开始处理,则可以在发射完成之前调用deleteLater。

如果您想保证首先执行完成,您可以使用阻塞连接来连接发送方和接收方,这将阻止发送方的线程,直到消息传递完毕。

connect(sender, SIGNAL(finished()), receiver, SLOT(handleFinished(), Qt::BlockingQueuedConnection);

请注意,如果使用Qt :: BlockingQueuedConnection并且发送方和接收方具有相同的线程关联,则应用程序将处于死锁状态。