c++ - deleteLater() 是否等待所有挂起的信号被传递?

标签 c++ qt

我正在考虑编写这段代码:

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/

相关文章:

C++ 没有匹配的构造函数

c++ - Delphi 中的动态数组和内存管理

c++ - for 循环中始终为 false 的 bool 条件是否得到优化?

qt - 从绝对文件路径使用分层结构填充 QTreeWidget

c++ - 尽管遵循正常初始化,但我的数组拒绝成为正确的大小

c++ - C++中的分页效果是什么?

Python Qt 如何从 QMainWindow 打开弹出的 QDialog

c++ - 应用程序中有很多线程会适得其反吗?

c++ - QT (C++) 中的简单声音 (.wav) 播放应用程序

qt - 从QWebEngineView或QWebEnginePage删除ScrollBar