首页 文章

Qt信号发射和QThread执行流程

提问于
浏览
1

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

直接连接发出信号时立即调用插槽 . 插槽在 Launcher 的线程中执行,该线程不一定是接收器的线程 .

所以我们承认我陷入困境

while (this->true_bool);

在线程1中,thread2发出一个信号,连接到上一行的“this”对象的一个槽,它将在循环退出后执行(所以从不)或将立即执行并在槽返回后执行回到原点(所以如果我改变这个 - > true_bool为false它将结束循环)?

这对我来说似乎很奇怪,它会引起对插槽的即时调用,但是文档似乎也这么说 .

2 回答

  • 3

    它将立即在 thread2 中执行,与 thread1 中的循环无关 .

    ...插槽在 Launcher 的线程中执行,这不一定是接收器的线程......

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

  • 3

    Qt调用工作如下:

    • 直接连接 . 只要您有直接连接,那么emit调用就会执行以下操作:枚举所有连接的插槽并逐个调用它们 . 插槽是函数,它们在emit调用期间立即被调用 . 因此,一旦 emit Something() 完成,就会执行直接连接到它的所有插槽 . 可以把它想象成一个函数指针数组,它们在调用期间逐个执行 . 所以所有的插槽都在你调用信号的同一个线程上执行 .

    • 排队连接 . 它类似于直接连接,但不是直接调用每个插槽,而是将其发布到与每个插槽关联的对象的队列中 . 因此,槽由目标对象关联的事件循环执行 . 因此它由目标对象所在的线程执行,而不是调用信号的线程(如果目标对象的线程和信号调用不相同) . 因此,当信号调用完成时,意味着对于所有排队的连接 QEvents 被发布到适当的队列,但这并不意味着时隙已被执行 .

相关问题