在多线程应用程序中是否存在DirectConnection
比其他应用程序更理想的情况?
是的,如果您的线程B
仅在单个函数中执行并且没有事件循环,那么这是您唯一的选择。使用or将不起作用,因为相应的插槽调用事件将不会在其他任何地方或任何地方处理。DirectConnection
AutoConnection
QueuedConnection
B
另一个原因DirectConnection
可能是您的参数不能使用 Qt 元对象系统进行序列化/反序列化。如果Qt::DirectConnection
满足条件(插槽是线程安全的),您可以改用它(注意后果 - 请参阅以下文本)。
您必须考虑的另一件事是跨多个插槽的信号分布。如果您使用DirectConnection
并且该插槽需要在互斥体上等待,则在该插槽之后连接的其他插槽将不会被激活,直到该插槽返回。在这种情况下使用QueuedConnection
将提供非阻塞信号分布。然后,线程 B 将阻塞(在其插槽调用事件的 qt 内部事件处理程序中),而不是在其“emit”语句中的线程 A。
您必须考虑的另一件事是插槽调用顺序。如果你emit
一个接一个地发出多个语句,并且同一个对象的槽被调用 using QueuedConnection
,它们是按这个顺序调用的,因为后面是普通的槽调用事件。如果其中一些槽是DirectConnection
,那么它们在发射线程中被同步调用,相对于其他排队的槽调用没有顺序保证!
编辑:我认为QObject::deleteLater也有一个有趣的案例。我建议使用Qt::DirectConnection
. 此函数是线程安全的,并将向对象的目标线程发送一个 delete-later 事件。更重要的是,该函数还处理对象的线程没有运行事件循环的情况(在这种情况下,对象在其线程退出时被删除)。如果您要使用Qt::QueuedConnection
并且目标线程中没有事件循环,那么您将创建内存泄漏。