【问题标题】:Qt signal emission and QThread execution flowQt信号发射和QThread执行流程
【发布时间】:2016-01-29 16:21:10
【问题描述】:

这是Qt的Threads and QObjects doc的一部分

直接连接 当信号被触发时,槽会立即被调用 发出。插槽在发射器的线程中执行,而不是 一定是接收者的线程。

所以让我们承认我被困在一个

while (this->true_bool);

在线程 1 中,线程 2 发出一个信号,连接到上一行的“this”对象的一个​​槽,它会在循环退出后执行(所以永远不会)还是会在槽后立即执行返回,它会回到 while(所以如果我将 this->true_bool 更改为 false,它将结束循环)?

这对我来说似乎很奇怪,它会立即调用插槽,但文档似乎这么说。

【问题讨论】:

    标签: c++ qt qthread qobject


    【解决方案1】:

    它将立即在thread2中执行,独立于thread1中的循环。

    ...槽在发射器的线程中执行,不是 一定是接收者的线程...

    编辑:我认为这个关于 QThread 的答案对你有用:https://stackoverflow.com/a/35056527/4149835

    【讨论】:

      【解决方案2】:

      Qt 调用如下:

      • 直接连接。每当您有直接连接时,emit 调用都会执行以下操作:枚举所有连接的插槽并一个接一个地调用它们。插槽是函数,它们在发出调用期间立即被调用。所以,一旦emit Something() 完成,所有直接连接到它的槽都被执行。把它想象成一个函数指针数组,在调用期间一个接一个地执行。因此,所有插槽都在您调用信号的同一线程上执行。
      • 排队连接。它类似于直接连接,但不是直接调用每个插槽,而是将其发布到与每个插槽关联的对象的队列中。因此,槽由与目标对象关联的事件循环执行。因此它由目标对象所在的线程执行,而不是调用信号的线程(如果目标对象的线程和信号调用不同)。因此,当信号调用完成时,这意味着对于所有排队的连接 QEvents 已发布到相应的队列,但这并不意味着插槽已执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        相关资源
        最近更新 更多