关于这个函数的例子:
void MyClass::myFunction()
{
emit MySignal1();
emit MySignal2();
}
如果我有 slot1
监听 MySignal1
,slot2
监听 MySignal2
:
1) slot1
是否总是在 slot2
之前执行?
2) 一个槽会一直执行到另一个槽完成吗?还是两个插槽可以并行运行?
最佳答案
答案完全取决于信号如何连接到它们各自的槽:假设两个信号都连接到同一个对象的槽,那么:调用总是按顺序 em>(假设你没有做一些奇怪的事情......但是你已经知道了......就像你过滤掉 QEvent::MetaCall
事件......这绝对是不推荐).
如果它们与 Qt::QueuedConnection
连接,发射总是立即返回并且不等待调用完成。
您可以使用 Qt::BlockingQueuedConnection
,然后发射 wait 调用返回(这只能在目标对象位于不同线程中时使用比当前正在运行的线程和目标对象的线程有一个正在运行的事件循环 - 否则会发生死锁!)。
对于 Qt::DirectConnection
,两次发射都将变成简单的函数调用,因此对于这种情况,顺序很简单。
如果您有不同的对象,那么如果您使用Qt::DirectConnection
,您仍然可以按顺序执行。
否则,对于 Qt::QueuedConnection
或 Qt::BlockingQueuedConnection
和目标对象位于同一个线程中,同样的事情适用于上面的同一个对象案件。如果他们生活在不同的线程中,对于非阻塞排队连接,你没有顺序保证.. 槽可能同时执行。为了阻止排队的连接,您再次订购了执行。
关于c++ - Qt 插槽是否与其他代码并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976366/