gpt4 book ai didi

qt - 发射和插槽顺序执行

转载 作者:行者123 更新时间:2023-12-04 23:25:34 25 4
gpt4 key购买 nike

一个线程做一个 emit signal1();
第二个线程执行 emit signal2();在第一个线程发送它的信号之后(在两个线程上发出调用之前锁定了相同的互斥锁并且我记录了它,我可以在我的日志中看到第一个线程在第二个线程之前获取锁)

第一个线程和第二个线程或不是 GUI 线程。

是否有任何保证signal1的slot会在signal2的slot之前被调用?

最佳答案

由于发射器和接收器对象在不同的​​线程中运行,因此插槽不会同步执行:Qt 默认使用排队连接而不是直接连接。但是,在连接信号和槽时,您可以通过使用阻塞排队连接(另请参阅 http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum 以了解不同连接类型的描述)来强制同步执行。

但是阻塞队列连接有一个成本:发射器线程被阻塞,直到所有连接的槽都执行完毕,这不一定是一个好主意。但是,如果您想使用非阻塞连接,则执行顺序取决于执行插槽的对象。

需要考虑的重要一点是每个 QThread 都有自己的事件队列。这意味着只有给定线程的插槽才能保证执行顺序。这意味着您必须考虑以下情况:

  • signal1 的 slot 和 signal2 的 slot 定义在 QObject 的同一个线程中:在这种情况下,您可以确定 slot 是按预期顺序执行的,因为它们是由相同的事件队列触发的
  • 两个插槽都在不同的线程中运行:在这里您无法控制执行顺序,因为信号被发布到 2 个独立的事件队列。如果是这种情况,您必须使用互斥锁或等待条件(或使用阻塞连接)。
  • 关于qt - 发射和插槽顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13230660/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com