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

news2024/11/24 11:55:38

老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.coloradmin.cn/o/871855.html

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

相关文章

⛳ Java集合框架

目录 ⛳ Java集合框架🎨 一、概述🏭 二、Iterator接口💭 2.1、基础用法🚜 2.2、原理🐾 2.3、为什么需要iterator接口☁ 2.4、ListIterator接口📢 2.5、iterator在集合中的实现例子2.5.1、Iterator在ArrayLi…

潜水减压多普勒超声气泡信号识别方法

用三参量模糊分析法识别潜水减压气泡信号的研究 摘要 三参量模糊分析法。建立了 f-p-Δp( 频率、谱峰、峰差) 三参量模糊分析法,综合气泡原本特征以及背景噪声计算评分以识别气泡,最后给予 SPENCERⅠ ~ Ⅲ分级原理和方法 减压气泡信号的能量…

分布式 - 消息队列Kafka:Kafka生产者发送消息的方式

文章目录 1. Kafka 生产者2. kafaka 命令行操作3. kafka 生产者发送消息流程4. Kafka 生产者的创建5. Kafka 生产者发送消息1. 发送即忘记2. 同步发送3. 异步发送 6. Kafka 消息对象 ProducerRecord 1. Kafka 生产者 不管是把Kafka作为消息队列、消息总线还是数据存储平台&…

Vue3组件库

Vue3组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目(yarn) D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh p…

asyncio是什么?

如果把进程比作从A处到B处去这件事,那么线程就是可供选择的多条道路,协程就是道路上特殊路段(类似限速,一整条道路都是特殊路段的话,就是全部由协程实现) 例图如下: 1. 什么是协程&#xff08…

FPGA应用学习笔记----CORDIC 算法和小结

加减移位操作来运算三角函数,开根号,求对数 圆周旋转模式

沁恒ch32V208处理器开发(四)串口通信

目录 串口资源资源配置同步模式单线半双工模式中断DMA 串口的初始化串口通信的实现 串口资源 资源配置 CH32V208 系列,是基于 RISC-V 指令架构设计的 32 位 RISC 内核 MCU,根据封装的不同,可用的USART串口资源如下表所示: 且US…

完美解决Github提交PR后报错:File is not gofumpt-ed (gofumpt)

问题阐述 最近在Github上提交PR后,遇到了这么一个问题:golangci-lint运行失败,具体原因是File is not gofumpt-ed (gofumpt)。 名词解释 golangci-lint: golangci-lint 是Go语言社区中常用的代码质量检查工具,它可以…

阿里云弹性裸金属服务器详细介绍(原神龙)

阿里云弹性裸金属服务器(ECS Bare Metal Server)是一种可弹性伸缩的高性能计算服务,原神龙服务器,计算性能与传统物理机无差别,具有安全物理隔离的特点,裸金属服务器分钟级的交付周期。阿里云服务器网分享阿…

现代控制理论step()函数使用方法,多输入多输出系统的阶跃响应图如何只输出一个输入对应输出的阶跃响应图(step(sys)如何单独显示一个子图)

多输入多输出系统的阶跃响应图 考虑以下二阶状态空间模型: A [-0.5572,-0.7814;0.7814,0]; B [1,-1;0,2]; C [1.9691,6.4493]; sys ss(A,B,C,0);这个模型有两个输入和一个输出,因此它有两个通道: 从第一个输入到输出,从第二个输入到输出。每个通道都…

ArcGIS Maps SDK for JavaScript系列之一:在Vue3中加载ArcGIS地图

目录 ArcGIS Maps SDK for JavaScript简介ArcGIS Maps SDK for JavaScript 4.x 的主要特点和功能AMD modules 和 ES modules两种方式比较Vue3中使用ArcGIS Maps SDK for JavaScript的步骤创建 Vue 3 项目安装 ArcGIS Maps SDK for JavaScript创建地图组件 ArcGIS Maps SDK for …

使用 vpn 后 git clone 无法下载项目

使用VPN后 git clone 命令无法下载项目 偶发使用 vpn 后 git clone 项目会卡住,或者报 timeout 错误 当我使用ping github.com是可以ping通的,但是 clone 项目就会卡住。去搜了一番发现: git 工具在使用代理后需要设置 git https.proxy 属…

Linux学习之awk数组

数组的定义: 数组是一种有关联关系的变量,通过下标依次访问。 数组名[下标] 值,下标可以使用数字也可以使用字符串。 数组的遍历: for(变量 in 数组名){ 数组名[变量] 操作 } 数组删除: delete 数组名,就可…

Fireworks CS6 不能把文件拖进去

打开软件安装文件夹 我的是:C:\Program Files\Adobe Fireworks CS6\Adobe Fireworks CS6 在该位置找到文件【Fireworks.exe】 右键属性 取消勾选,【以管理员身份运行此程序】

Mysql数据库第十三课-----------sql语句的拔高3--------直冲云霄

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

Python Opencv实践 - 图像平移

import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像平移 #cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) # M是仿射变换矩阵,对于平移来说M是一…

【网络编程】高级IO

文章目录 一、五种IO模型的基本理念二、IO重要概念 1.同步通信与异步通信的对比2.阻塞VS非阻塞三丶非阻塞IO的代码演示四丶IO多路转接select总结 一、五种IO模型的基本理念 首先IO就是 等 数据拷贝,还记得我们之前实现服务器用的read/recv接口的,当时我…

Codeforces Round 892 (Div. 2)

A.最大值只能由自己除&#xff0c;所以无解的情况只能是全部相同&#xff0c;否则直接最大值放c即可 #include<bits/stdc.h> using namespace std; const int N 2e510,mod998244353; #define int long long typedef long long LL; typedef pair<int, int> PII;in…

【TI毫米波雷达笔记】MMWave配置流程避坑

【TI毫米波雷达笔记】MMWave配置流程避坑 在TI SDK目录下的mmwave.h文档说明中 强调了要按以下配置&#xff1a; mmWave API The mmWave API allow application developers to be abstracted from the lower layer drivers and the mmWave link API.The mmWave file should b…

macOS使用ffmpeg与QT进行音视频推拉流

1.先启动流服务器 ./mediamtx 2.开始推流: ffmpeg -re -stream_loop -1 -i /Users/hackerx/Desktop/test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 3. 安装ffmpeg 4.4 brew install ffmpeg4 4.添加ffmpeg头文件目录与库目录 5.链接ffmpeg相关库…