c++ - Qt 插槽是否与其他代码并行运行?

标签 c++ qt

关于这个函数的例子:

void MyClass::myFunction()
  {
    emit MySignal1();
    emit MySignal2();
  }

如果我有 slot1 监听 MySignal1slot2 监听 MySignal2:

1) slot1 是否总是在 slot2 之前执行?

2) 一个槽会一直执行到另一个槽完成吗?还是两个插槽可以并行运行?

最佳答案

答案完全取决于信号如何连接到它们各自的槽:假设两个信号都连接到同一个对象的槽,那么:调用总是按顺序 em>(假设你没有做一些奇怪的事情......但是你已经知道了......就像你过滤掉 QEvent::MetaCall 事件......这绝对是不推荐).

如果它们与 Qt::QueuedConnection 连接,发射总是立即返回并且不等待调用完成。

您可以使用 Qt::BlockingQueuedConnection,然后发射 wait 调用返回(这只能在目标对象位于不同线程中时使用比当前正在运行的线程和目标对象的线程有一个正在运行的事件循环 - 否则会发生死锁!)。

对于 Qt::DirectConnection,两次发射都将变成简单的函数调用,因此对于这种情况,顺序很简单。


如果您有不同的对象,那么如果您使用Qt::DirectConnection,您仍然可以按顺序执行。

否则,对于 Qt::QueuedConnectionQt::BlockingQueuedConnection 和目标对象位于同一个线程中,同样的事情适用于上面的同一个对象案件。如果他们生活在不同的线程中,对于非阻塞排队连接,你没有顺序保证.. 槽可能同时执行。为了阻止排队的连接,您再次订购了执行。

关于c++ - Qt 插槽是否与其他代码并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976366/

相关文章:

c++ - 使用可变参数模板的递归元函数

c++ - 将字节数组转换为位集

c++ - Qt物理场景多线程

qt - 如何在QT中访问父控件指针

c++ - QVariant 转换无法识别我的模板调用的 std::string

c++ - 如何使用 SSE 更有效地乘以 A*B^T 或 A^T*B^T(T 表示转置)矩阵?

c++ - 创建一个包含目录中文件名的 C++ 容器

c++ - 在 Windows 中删除文件时 CMD 和 PowerShell 有什么区别?

c++ - 我应该帮助哪个开源 C++ 数据库 GUI 项目?

qt - 在 QGraphicsScene::addItem ( QGraphicsItem * item ) 之后获取项目的父场景