【Qt高阶】老Qt都不一定清楚的“QObject线程亲和性”【2023.08.13】

老Qt都不一定清楚的“线程亲和性”

请添加图片描述

与题目无关

  感觉自己还挺2,有粉丝点了那个契约者会给up发个鼓励的话,我还以为是人私信发的,都挨个感谢了,后来才意识到是系统自动发的😣😣😣。

  自上上期视频对Qt的槽函数执行在哪个线程做了分享之后,针对评论进行扩展学习,越发觉得自己对Qt底层不甚了解。尽管自己是从MFC转的Qt,对windows的消息有一定的技术储备,但是Qt做了封装之后,真就很多东西你要是光用的话很简单,但是深入下去搞懂Qt的源码,那就任重道远了。

  各平台对Qt信号槽的机制讲解结合我最近对源码的阅读,属实是粗浅。后期想针对Qt的信号槽这块的源码,从moc.exe编译出的cpp文件逐行代码讲起,将Qt信号槽讲透彻,其中必然涉及:d指针、事件循环、事件内核对象、窗口消息机制、以及很多帮助文档查不到的源码中存在的类。这就得整成成套的教程了,规划9月30号前把这块弄好。

简介

  本文继续围绕QThreadQTimer那个例子进行讲解。分析Qt槽函数执行在哪个线程,只不过这次拿官方的帮助文档背书。从手册中找解答。

一、回顾信号槽连接的connect函数

请添加图片描述

Qt信号槽连接的几种方式

  这是一个枚举值,描述了信号与槽的连接类型,连接类型会决定槽是被立即执行还是稍后执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXLhL8l8-1691917098505)(F:\B站视频\Qt教程\Qt连接的几种方式.png)]

  自动连接:接收者与发送者在同一个线程构建,信号槽就会是直接连接,否则就是入队连接。连接类型具体是什么是当信号发出的时候才决定。

  直接连接:当信号发出的时候,槽被立即调用,槽执行在发信号的线程。

  入队连接:槽执行在接收者的线程。当控制返回接收者线程的事件循环时槽被调用。

  阻塞入队连接:与入队连接一样,除了发信号的线程会被阻塞直到槽返回阻塞才会失效。如果发信号和槽是在同一个线程使用这种连接会造成死锁。

  独占连接:一个信号只能连接到一个槽。可以与上面的四种组合使用。

二、本文的主角-“线程亲和性”

请添加图片描述

知识点:

  1. 一个QObject是存活在一个确定的线程的,这就叫线程的亲和性。
  2. 一个QObject接收到一个入队的信号或post出的事件,槽或者事件处理器会运行在QObject存活的那个线程。

如果一个对象没有线程亲和性,或所在的线程没有事件循环,则这个对象不会接收到信号和事件。

  1. 默认情况下,QObject执行在创建它的那个线程,可以通过thread() 查询它的线程亲和性。
  2. 线程亲和性可以被moveToThread()改变。
  3. 所有的QObject与他们的父是同一个线程。

如果两个对象处于不同的线程,setParent()会失败

moveToThread()会失败,如果QObject已经有父了。

如果QObject在run函数中创建,它们就不能变成QThread对象的孩子,因为QThread不存活在调用QThread::run的线程。

  1. 一个QObject的成员变量不会自动变成该类的子对象的,除非是构造函数传参,或者是调setParent。不指定父子关系,类的成员变量任然生存于老线程。

三、其实也不要以为Qt多牛逼,老马说过:“任何观念都可以从现实世界中找到其物质的“原型”

  线程亲和性这个技术也是有迹可循,参考下面的文章。

linux进程、线程与cpu的亲和性(affinity) - zhangwju - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 使用灯光后,场景中就会产生阴影。物体的背面确实在黑暗中,这称为核心阴影(core shadow)。我们缺少的是落下的阴影(drop shadow)&#…

【数据结构】——栈、队列的相关习题

目录 题型一(栈与队列的基本概念)题型二(栈与队列的综合)题型三(循环队列的判空与判满)题型四(循环链表表示队列)题型五(循环队列的存储)题型六(循…

一文揭秘饿了么跨端技术的演进、实践与落地

跨端技术背景与演进历程 跨端,究竟跨的是哪些端? 自 90 年的万维网出现,而后的三十多年,我们依次经历了 PC 时代、移动时代,以及现在的万物互联(的 IoT )时代,繁荣的背后&#xff…

【Apollo】Apollo-ros版本架构学习与源码分析

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Apollo-ros版本架构学习与源码分析。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&a…

微信小程序如何自定义分享卡片文案和图片

微信小程序提供了onShareAppMessage方法,专门用来监听用户点击页面内转发按钮(button 组件 open-type"share")或右上角菜单“转发”按钮的行为,并自定义转发内容。 > 注意:只有定义了此事件处理函数&…

Android studio 设置安卓手机

参考这个链接 ghttps://developer.android.com/studio/debug/dev-options 列出常用手机的设置,但是我的手机不在此列 Google Pixel Settings > About phone > Build number Samsung Galaxy S8 and later Settings > About phone > Software informa…

git: ‘lfs‘ is not a git command. see ‘git --help‘

在克隆hugging face里面的项目文件的时候,需要用到git lfs,本文介绍安装git lfs方法 在Ubuntu下 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs在Windows下 到这个链…

解决GitHub的速度很慢的几种方式

1. GitHub 镜像访问 这里提供两个最常用的镜像地址: https://hub.njuu.cf/search https://www.gitclone.com/gogs/search/clonesearch 也就是说上面的镜像就是一个克隆版的 GitHub,你可以访问上面的镜像网站,网站的内容跟 GitHub 是完整同步…

期权定价模型系列【4】—期权组合的Delta-Gamma-Vega中性

期权组合的Delta-Gamma-Vega中性 期权组合构建时往往会进行delta中性对冲,在进行中性对冲后,期权组合的delta敞口为0,此时期权组合仍然存在gamma与vega敞口。因此研究期权组合的delta-gamma-vega敞口中性是有必要的。 本文旨在对delta-gamma-…

关于新手学习STM32开发应该如何入门?

对于新手来说,学习STM32开发可能会感到困惑,尤其是在拿到开发板后该如何入门。在这里有嵌入式学习路线,毕设,各种项目,需要留个6。以下是部分内容概述:硬件介绍:了解STM32开发板的基本硬件组成和…

Springboot 默认路径说明

Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的样板配置,极大的方便了开发者,其默认识别路径如下: Spring Boot 作为Spring默认将 /** 所有访问映射到以下目录: 1、classpath:/static 用于加…

【密码学】穴居人密码

穴居人密码 文字记载中,有时会把来自古希腊文化之前的各种记录作为密码学的例子,但称它们为密码学一定太不严格了,这是因为那些方法都太原始了。密码学的起源能追溯到多早,取决于你把密码学的相关定义确定得有多宽泛。大多数作者都…

每日后端面试5题 第四天

1. 线程池的核心参数(高薪常问) (1)corePoolSize:核心线程个数 (2)maximumPoolSize:最大线程个数 (3)keepAliveTime:最大存活时间 &#xff0…

如何在Vue中进行单元测试?什么是Vue的模块化开发?

1、如何在Vue中进行单元测试? 在Vue中进行单元测试可以提高代码的可维护性和可读性,同时也能够帮助开发者更快地找到代码中的问题和潜在的错误。下面是一些在Vue中进行单元测试的步骤: 安装单元测试工具 首先需要安装一个单元测试工具&…

第8章 【C语言】善于利用指针

8.1 指针是什么 由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。将地址形象化称为“指针”。 直接按变量名进行的访问,称为“直接访问”方式。 还可以采用另一种称为“间接访问”的方式,即将变量i的地址存放在另…

如何让你的图片服务也有类似OSS的图片处理功能

原文链接 前言 有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据,常见的存储系统有以NAS、FASTDFS为代表的传统文件存储,和以Minio为代表的对象存储系统,随着云服务的兴起很多公司逐渐将数据迁移到以阿里云…

二叉树的性质和完全二叉树的性质

二叉树的性质: 在二叉树的第i层至多有 2 i 1 ( i > 1 ) 2^{i1}(i>1) 2i1(i>1) 深度为k的二叉树最多有 2 k − 1 2^k-1 2k−1个结点 对于任意一棵二叉树T,如果其终端结点数为 n 0 n_0 n0​,度为2的结点数为 n 2 n_2 n2​,则 n 0 …

【剑指 Offer 39】数组中超过一半的数字

题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 思考: 方法一:投…

5.0 Python 定义并使用函数

函数是python程序中的基本模块化单位,它是一段可重用的代码,可以被多次调用执行。函数接受一些输入参数,并且在执行时可能会产生一些输出结果。函数定义了一个功能的封装,使得代码能够模块化和组织结构化,更容易理解和…

企业有VR全景拍摄的需求吗?能带来哪些好处?

在传统图文和平面视频逐渐疲软的当下,企业商家如何做才能让远在千里之外的客户更深入、更直接的详细了解企业品牌和实力呢?千篇一律的纸质材料已经过时了,即使制作的再精美,大家也会审美疲劳;但是你让客户远隔千里&…