我正在考虑编写这段代码:
emit finished();
deleteLater();
但这让我想知道 finished()
是否总是在对象被删除之前传递。我非常确定它将为 Qt::DirectConnection
提供,但我不确定 Qt::QueuedConnection
,或者该插槽是否位于另一个线程中。
最佳答案
当发出信号时,它会被放入接收对象的线程的事件队列中进行处理。调用deleteLater还会将一个事件添加到队列中,因此如果接收对象和正在删除的对象具有相同的线程关联性,则无论线程类型如何,它们都会顺序执行。
如果发送者和接收者具有不同的线程亲和性(在不同的线程中运行),那么如果接收者的事件循环在发送者的事件循环之前开始处理,我希望在发出完成之前调用deleteLater。
如果你想保证finished首先执行,你可以使用阻塞连接来连接发送者和接收者,这将暂停发送者的线程,直到消息被传递为止。
connect(sender, SIGNAL(finished()), receiver, SLOT(handleFinished(), Qt::BlockingQueuedConnection);
请注意,如果使用 Qt::BlockingQueuedConnection 并且发送方和接收方具有相同的线程关联性,则应用程序将出现死锁。
关于c++ - deleteLater() 是否等待所有挂起的信号被传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863629/