首页 > 其他分享 >对象所属线程

对象所属线程

时间:2022-11-14 11:55:51浏览次数:47  
标签:Qt 对象 QueuedConnection 线程 信号 所属 连接 函数

对象所属线程

QT中的信号槽与c++中的回调很像,又和通知很像,代码行至某处,发送信号emit,然后槽函数接收到信号;

但是QT也支持跨线程执行,就是A对象给B对象发送信号,B不会立即执行信号,而是等待B所属线程(创建B的时候在哪个线程,对象就属于哪个线程)有空闲,然后执行槽函数;

1 信号槽的使用涉及继承QObject;MOC文件的生成,涉及到元对象编译器重新编译信号槽函数;

2 在Qt4中槽函数必须要进行显示声明,否则人家不认,在Qt5中不需要额外的声明

Qt::AutoConnection(默认)

根据 sender 和 receiver 两者所在线程,当信号发出时作出判断。同一线程则 Qt::DirectConnection 连接,否则使用 Qt::QueuedConnection 连接。
容易产生误区的点:不是sender的所属线程,而是真正触发了emit 信号的动作线程。 Qt::DirectConnection 无论sender和receiver是否在统一线程,都会立刻调用槽函数,最简单的理解成把一段代码“临时插入”到了运行栈,所以在多线程情况下非常危险,必须做好线程同步。 Qt::QueuedConnection sender的信号会被压入到接收者的事件循环中,所以不会立即调用。而是等到当接收者对象处理其自身的消息队列时,再针对消息队列中的这个信号进行处理。
可以说就是为了开发者解决跨线程通信而设计的。当然你也可以用于同一个线程不同对象,这种相同线程的强行指定队列方式通常都会和GUI的模态窗有关(后面会举例分析)。 Qt::BlockingQueuedConnection 这个真的是看名字就知道干了啥,Blocking+QueuedConnection,这就说明他的槽函数运行时机与QueuedConnection是一致的。那Blocking的意义是什么?
就是阻塞发送者!直到槽函数运行完毕再继续执行。源码上相比QueuedConnection的实现多加了一个等待输入的信号量QSemaphore,所以一旦接收者和发送者在同一线程,那势必就会产生死锁。 Qt::UniqueConnection 这个其实严格上来说相比上面四种方式并不算新的连接方式,而是用于修饰上面的四种连接方式。他实现的效果就是避免重复连接,因为Qt的信号槽是可以同一个信号和槽函数重复多次连接。
这种通常都会是只执行一次就好,那就通过这个标志位进行修饰,达到多次连接(实际上也只是连接了一次)也只调用一次槽函数的效果。用(Qt::ConnectionType|Qt::UniqueConnection)来修饰。 ———————————————— 原文链接:https://blog.csdn.net/u013052326/article/details/122272460

 

标签:Qt,对象,QueuedConnection,线程,信号,所属,连接,函数
From: https://www.cnblogs.com/8335IT/p/16878716.html

相关文章

  • Python如何研究类、对象、方法、函数之间的关系
    1,从某个类或对象出发,研究其上级父类,下级子类,同级类。自身类内部的函数和变量2,上级类base,下级类subclasses方法,同级类需要先上后下。3,查看某个类和对象支持哪些变量使用di......
  • 面向对象的思想初步了解
    面向对象和之前学的面向过程是2种不同的编程思想,两者的思维有较大的区别,下面将举例初步表现这两种思想的差异性设计一个程序去统计字符串"wantyoutoknowonething"中......
  • 设计模式之【建造者模式】使用java建造者模式优雅创建对象
    文章目录​​什么是建造者模式​​​​一步一步认清建造者模式​​​​1、传统方式创建对象​​​​2、建造者模式创建对象​​​​建造者模式优缺点​​​​建造者模式适用......
  • Qt -- 线程的使用(基础到高级)
    线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程......
  • 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos《支持JDK19虚拟线程的web框架》系列文章链接支持JDK19虚拟线......
  • Java多线程中的ThreadLocal线程本地变量
    概论ThreadLocal指的是开辟一块统一初始化的空间,在这个区域块里每个线程使用的区域独立,互不干扰。一般创建为对象的静态属性。常用方法:set(value)get(value)子类的initia......
  • 022.OneToMany对象关联查询(多表级联查询)
    1.案例分析1.班级(1)--->学生(n)学生必须持有班级的外键2.1对1通过主键关联3.多对多必须单独抽象出一张中间表  2.商品和详情对象关联查询(一对多)2.1创建商品......
  • 面向对象
    类方法与静态方法类方法:类方法通过@classmethod装饰器实现,类方法与普通方法的区别是,类方法只能访问类变量,不能访问实例变量。因为添加classmethod后,self不代表实例,而代表......
  • Java中指令重排在多线程中出现数据错误的例子
    概述听说当两条指令互相不依赖的时候,在cpu或者jvm那儿可能会为了提高性能而进行指令重排。数据依赖比如下面两条代码就没有数据依赖:int a=5;int b=2;这两条指......
  • python面向对象-继承
    对象继承单继承:即继承父类的属性方法 super()方法场景:既想用父类的__init__属性,又想用自己的__init__属性,如果不在子类中加这个函数,直接在子类写__init__,那么会重写父......