Qt 发出和执行指令

Qt 发出和执行指令,qt,signals,Qt,Signals,一个线程执行emit signal1() 第二个线程执行emit signal2()在第一个线程发送信号后(在两个线程上发出调用之前锁定了相同的互斥锁,我记录了它,我可以在日志中看到第一个线程在第二个线程之前获得锁) 第一个线程和第二个线程,或者不是GUI线程 有没有保证signal1的插槽将在signal2的插槽之前被调用?我不确定我是否理解正确,但这可能会帮助您: 当发出信号时,通常会立即执行与其连接的插槽,就像正常的函数调用一样 从 因此,可以将调用emit()视为调用任何其他函数。emi

一个线程执行
emit signal1()

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

第一个线程和第二个线程,或者不是GUI线程


有没有保证signal1的插槽将在signal2的插槽之前被调用?

我不确定我是否理解正确,但这可能会帮助您:

当发出信号时,通常会立即执行与其连接的插槽,就像正常的函数调用一样


因此,可以将调用emit()视为调用任何其他函数。

emit
只是语法上的糖分,看看元对象编译器(moc)生成的.cpp


所以,
emit signal1()编译为
signal1(),您的问题的答案是肯定的,但您当然不能保证signal1()执行在signal2()调用之前结束。

由于发射器和接收器对象在不同的线程中运行,插槽将不会同步执行:默认情况下,Qt使用排队连接而不是直接连接。但是,在连接信号和插槽时,可以通过使用阻塞排队连接(另请参见不同连接类型的说明)强制同步执行

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

<> P>要考虑的是每个Q线程都有自己的事件队列。这意味着只有给定线程的插槽才能保证执行顺序。这意味着你必须考虑以下情况:

  • signal1的插槽和signal2的插槽在QObject的“生活在同一线程中”中定义:在这种情况下,您可以确保插槽按预期顺序执行,因为它们是由相同的事件队列触发的
  • 两个插槽都在不同的线程中运行:在这里,由于信号被发布到两个独立的事件队列,您无法控制执行顺序。如果是这种情况,则必须使用互斥锁或等待条件(或使用阻塞连接)

发射没有执行到GUI线程中,因此插槽执行不是顺序的!好的,从我收集的信息来看,你有:
线程1
线程2
GUI线程
。您希望确保在从线程2调用函数之前执行从线程1调用函数(
emit()
)。您可以使用互斥,正如您在问题中所写的那样。在
Thread#1
中的
emit()
之后打开互斥锁。emit不会在GUI线程中执行,因此插槽执行不是顺序的!你是对的,但是OP写了“第二个线程执行一个emit signal2();在第一个线程发送了信号之后”,他们的问题似乎更像是“信号调用和连接插槽调用之间是否存在不可预测的延迟”,答案是否。我打开了一篇新帖子,我的问题似乎不清楚