我在考虑编写此代码:

emit finished();
deleteLater();

但这让我想知道finished()是否总是在删除对象之前传递。我很确定它将为Qt::DirectConnection交付,但是我不确定Qt::QueuedConnection或该插槽是否在另一个线程中。

最佳答案

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

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

如果要确保先执行完成,则可以使用阻塞连接来连接发送方和接收方,这将暂停发送方的线程,直到传递完邮件为止。

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

请注意,如果使用Qt::BlockingQueuedConnection且发送方和接收方具有相同的线程相似性,则应用程序将被死锁。

关于c++ - deleteLater()是否等待所有未决信号被传递?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19863629/

10-09 06:33