当前位置: 首页 > news >正文

【Qt高级】QThread与QTimer组合使用引出的信号槽执行在哪个线程的思考【2023.08.06】

源码见 testQThread_QTimer…

Qt 版本5.6.3
视频讲解:https://www.bilibili.com/video/BV15P411C79i/
链接: 视频讲解

简介

  想法很单纯,就是主线程启动一个子线程,子线程里启动一个定时器,定时执行一些任务,然鹅实际开发中警告不断。😒Qt

警告内容有:

1.QObject: Cannot create children for a parent that is in a different thread.

2.QObject::killTimer: Timers cannot be stopped from another thread

3.QObject::moveToThread: Cannot move objects with a parent

对线程和线程对象的理解

  线程对象是一个内核对象,就和常用的打开文件会获得一个文件句柄的句柄都属于稀缺的资源。线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,每个线程可以并发执行不同的任务。

  一个进程一定有一个主线程,子线程是从主线程启动的。线程的关键特性除了并发性其实还有一个比较隐晦,就是线程的模块性。这是因为线程执行内容总应该是负责某块功能,具有一定独立性。举例来说,main.exe启动一个独立的线程来定时检查更新,显然这个线程负责的功能就很明确,如果更新检查除了问题,就检查这个线程涉及的所有代码。

  线程的退出:一般情况,线程干完活就自动释放了。还是拿上面的检查线程来说,如果他的使命是检查5次是否有更新,则检查完5次,没干的了,这个线程就会退了。除非是一直检查,这个线程才会一直运行下去。

关于QThread

  QThread这个类封装了对线程对象的管理,相当于我们雇佣了一个工人,需要发个工牌来知道都有哪些工人,通过工牌的工号发布指令。显然,如果只有一个主线程就不需要了,因为系统已经干了。

  具体到QThread的用法,主流的就2种。后续有代码解析。

方法一:继承QThread,并重写run方法、

方法二:将代码逻辑封装为一个类,

关于QTimer

  QTimer用于执行一些定时任务,往往采用信号槽的方式,连接timeout()函数至槽函数。

  QTimer的启动、停止、创建、销毁都需在同一个线程中。主线程中用的很easy,一旦涉及到子线程使用难度就上来了,需要保证QTimer的创建、启动、停止、销毁都是在同一线程。而往往我们都是在各种槽函数中对定时器停止。

Qt 槽函数到底执行在哪个线程?

  解决开篇警告的核心是搞清楚槽函数执行在哪个线程,以及为啥执行在那个线程。

这个答案来于互联网,然而我实测的结果不是这样的。

在多线程的Qt程序中,一个槽函数的执行线程是由发出信号的线程决定的,而不是连接该信号的线程。

具体来说:

  1. 如果信号是在主线程发出的,则槽函数会在主线程执行,即使该槽函数是在其他线程中连接的。
  2. 如果信号是在非GUI线程发出的,则槽函数会在该非GUI线程执行,即使是在主线程中连接的。
  3. 槽函数总是会在信号发出的线程中执行。

** 构造函数的执行顺序

  看似简单,我只要保证emit是在哪个线程即可。但实际开发中涉及类的组合关系,A类的成员类B类,在调用A类的构造之前会先调用B类的构造,B类的构造,而B类的构造还是在上一级的线程中。这也就导致了类A被moveToThread之后成了线程m_thred的资源,而A的B成员则还是主线程的资源。

class CB{
public:CB(){}
private:
}
class CA{
public:CA(){ moveToThread(&m_thread); }
private:CB m_b; QThread m_thread;
}

总结

  槽函数执行在哪个线程取决于发出信号的对象和槽函数的对象是在哪个线程构造的。要想保证成员类的槽函数都执行在子线程,成员类的构造就需在子线程,也就是成员类要以指针的方式组合,在合适的时机new对象出来。

相关文章:

【Qt高级】QThread与QTimer组合使用引出的信号槽执行在哪个线程的思考【2023.08.06】

源码见 testQThread_QTimer… Qt 版本5.6.3 视频讲解:https://www.bilibili.com/video/BV15P411C79i/ 链接: 视频讲解 简介 想法很单纯,就是主线程启动一个子线程,子线程里启动一个定时器,定时执行一些任务,然鹅实际开…...

用于大型图像模型的 CNN 内核的最新内容

一、说明 由于OpenAI的ChatGPT的巨大成功引发了大语言模型的繁荣,许多人预见到大图像模型的下一个突破。在这个领域,可以提示视觉模型分析甚至生成图像和视频,其方式类似于我们目前提示 ChatGPT 的方式。 用于大型图像模型的最新深度学习方法…...

索尼电视怎么完全关机

索尼电视怎么完全关机 当用户想要关闭索尼电视时,可能会遇到一些问题。例如,他们可能会遇到如何完全关闭电视的问题。在本文中,我们将介绍如何完全关闭索尼电视。 首先,您需要找到索尼电视的电源按钮。通常,该按钮位…...

AI介绍——chat gpt/文心一言/claude/bard/星火大模型/bing AI

AI体验 1. AI 介绍(注册和使用)1.1 Chat GPT1.2 文心一言1.3 Slack 上的 Claude1.3.1 Claude 介绍1.3.2 Claude 使用 1.4 Google的Bard1.4.1 Bard 介绍1.4.2 Bard 使用 1.5 科大讯飞的星火大模型1.5.1 星火大模型 介绍1.5.2 星火大模型 使用 1.6 new bin…...

C++ 访问控制——公有继承、私有继承、保护继承

派生类继承了基类的全部数据成员和除了构造函数和析构函数之外的全部函数成员,但是这些成员的访问属性在派生的过程中是可以调整的。从基类继承的成员,其访问属性由继承方式控制。 基类的成员有public(公有)、protected&#xff…...

python性能调试

py-spy生成cpu火焰图 ft5.svg env/xxxx/bin pid26443$env/py-spy record -o /tmp/$f --pid $pid --nativememray实时查看内存 env/xxxx/bin$env/python -m memray run --live --trace-python-allocators --native run_demo.pymemray生成内存火焰图报告 frun_demo_042.bin en…...

738. 单调递增的数字

738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输出…...

ssh安全远程管理

目录 1、什么是ssh 2、ssh登陆 3、ssh文件传输 1、什么是ssh ssh是 Secure Shell 的缩写&#xff0c;是一个建立在应用层上的安全远程管理协议。ssh 是目前较为可靠的传输协议&#xff0c;专为远程登录会话和其他网络服务提供安全性。利用ssh 协议可以有效防止远程管理过程中…...

外部排序算法总结

一.内排总结 在之前博客里&#xff0c;博主已经介绍了各种内部排序算法的原理和C语言代码实现&#xff0c;不懂的朋友可以在同系列专栏里选择查看&#xff0c;今天介绍常见排序算法的最后一点&#xff0c;也就是外部排序。在此之前&#xff0c;我们先对外部排序的各种算法做一…...

Redis安装以及配置隧道连接(centOs)

目录 1.centOs安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Xshell配置隧道 1.centOs安装Redis #使⽤yum安装Redis yum -y install redis 2. Redis 启动和停⽌ #查看是否启动 ps -ef|grep redis#启动redis: redis-server /etc/redis.conf &#停⽌Redis redis-cli sh…...

mysql二进制方式升级8.0.34

一、概述 mysql8.0.33 存在如下高危漏洞&#xff0c;需要通过升级版本修复漏洞 Oracle MySQL Cluster 安全漏洞(CVE-2023-0361) mysql/8.0.33 Apache Skywalking <8.3 SQL注入漏洞 二、查看mysql版本及安装包信息 [rootlocalhost mysql]# mysql -V mysql Ver 8.0.33 fo…...

Kotlin单例代码实例

目录 一、饿汉式的实现二、懒汉式的实现三、安全 懒汉式的实现四、双重校验DCL 的实现 一、饿汉式的实现 Kotlin版本 object SingletonDemoKt/*** 背后的逻辑代码&#xff1a;public final class SingletonDemoKt {public static final SingletonDemoKt INSTANCE;private Si…...

(7.28-8.3)【大数据新闻速递】《数字孪生工业软件白皮书》、《中国绿色算力发展研究报告》发布;华为ChatGPT要来了

【数字孪生工业软件白皮书&#xff08;2023&#xff09;】 近日&#xff0c;第七届数字孪生与智能制造服务学术会议成功举行&#xff0c;2023《数字孪生工业软件白皮书》在会上正式发布。《白皮书》在《Digital Twin》国际期刊专家顾问委员会指导下&#xff0c;由国家重点研发计…...

TikTok海外抖音云控抢金币宝箱

TikTok海外抖音云控抢金币宝箱 中芯密科云控系统是一个稳定、操作简单的自动化管理工具&#xff0c;专为大型机房设计&#xff0c;可以监控、控制和管理机房内的设备。该系统具有负载均衡、操作简单、高容错等特点&#xff0c;能够提高机房设备的稳定性和可用性。 该系统具有以…...

H3C交换机如何通过MAC和IP查寻对应ARP信息

环境&#xff1a; H3C S6520-26Q-SI version 7.1.070, Release 6326 问题描述&#xff1a; H3C交换机如何通过MAC 查寻对应IP信息 解决方案&#xff1a; 一、已知设备MAC地址为ac11-b134-d066 通过MAC 查寻对应IP信息 命令 dis arp | in X-X-X [H3C]dis arp | in ac11…...

python进阶

目录 Json数据格式 前言 JSON格式 python数据和Json数据的相互转化 多线程 进程和线程 串行和并行 多线程编程 创建线程参数 具体案例 网络编程 套接字 socket服务端编程步骤 socket客户端编程步骤 python操作mysql数据库 查询并接收数据 数据插入 Json数据格…...

spring boot 配置文件和属性注入

文章目录 配置文件位置和路径自定义配置文件 属性注入添加yaml文件的支持 配置文件 位置和路径 当我们创建一个 Spring Boot 工程时&#xff0c;默认 resources 目录下就有一个 application.properties 文件&#xff0c;可以在 application.properties 文件中进行项目配置&am…...

springboot+vue私人健身和教练预约管理系统 nt5mp

随着世界经济信息化、全球网络化的到来&#xff0c;信息线上管理的飞速发展&#xff0c;为私人健身和教练预约管理的改革起到关键作用。若想达到安全、快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的私人健身和教练预约管理系…...

Kotlin基础(十一):反射和注解

前言 本文主要讲解kotlin反射和注解。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 kotlin反射 1.1.1 kotlin反射概念和常见使用场景 在Kotlin中&#xff0c;反射是一种能够在运行时动态地获取、检查和操作类、属性、方法等结构的能力。Kotlin为反射提供了一…...

DALLE2论文解读及实现(一)

DALLE2: Hierarchical Text-Conditional Image Generation with CLIP Latents paper: https://cdn.openai.com/papers/dall-e-2.pdf github: https://github.com/lucidrains/DALLE2-pytorch DALLE2概览&#xff1a; - CLIP模型&#xff1a; 用于生成text embedding zt 和image …...

终极指南:3种方法快速部署Windows官方包管理器Winget

终极指南&#xff1a;3种方法快速部署Windows官方包管理器Winget 【免费下载链接】winget-install Install WinGet using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2019/2022. 项目地址: https://gitcode.com/gh_mirrors/wi/w…...

ceshi1

进入2026年&#xff0c;企业数字化转型已从“流程数字化”全面转向“认知自动化”。 据最新行业数据显示&#xff0c;企业内部超过85%的数据以PDF、图片、音视频、扫描件等非结构化形式存在。 这些数据曾被视为“沉默的资产”&#xff0c;因为传统OCR或规则引擎难以处理其复杂的…...

Windows Cleaner终极指南:3分钟解决C盘爆满,让电脑重获新生![特殊字符]

Windows Cleaner终极指南&#xff1a;3分钟解决C盘爆满&#xff0c;让电脑重获新生&#xff01;&#x1f680; 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是…...

缤纷夏日 心有所“暑”

邻聚美好时光&#xff0c;在升腾的烟火气里我们共同收藏了夏日的N种欢乐回顾七月光影流转的坝坝电影唤醒了儿时记忆孩子们在飞舞的泡泡大作战里嬉闹篮球场上矫健的身姿瞬间定格更有贴心的便民服务磨亮生活锋刃、洗净门前地垫&#xff0c;便捷直达家门这个缤纷夏日&#xff0c;因…...

ESP32S3驱动1.3寸圆形AMOLED屏(RM67162芯片)的完整避坑指南:从SPI配置到LVGL局部刷新修复

ESP32S3驱动1.3寸圆形AMOLED屏&#xff08;RM67162芯片&#xff09;全流程实战&#xff1a;从SPI配置到LVGL优化 这块1.3寸圆形AMOLED屏幕以其出色的显示效果和独特的外形设计&#xff0c;在智能穿戴设备和小型嵌入式项目中越来越受欢迎。然而&#xff0c;当它与ESP32S3开发板结…...

通过用量看板与账单追溯实现团队 AI 成本精细化管理

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板与账单追溯实现团队 AI 成本精细化管理 对于技术团队而言&#xff0c;将大模型能力集成到产品与研发流程中已成为常态…...

无代码物联网水浸检测系统:基于Adafruit FunHouse与WipperSnapper的快速搭建指南

1. 项目概述&#xff1a;当漏水警报响起时&#xff0c;你正在悠闲地喝咖啡地下室的水管是不是又漏了&#xff1f;空调的冷凝水是不是溢出来了&#xff1f;放在角落的鱼缸有没有裂开&#xff1f;对于很多家庭用户、小型工作室管理员或是物业设施维护人员来说&#xff0c;水患是潜…...

别再死磕官网了!用Docker Compose 5分钟搞定Weaviate向量数据库本地部署

5分钟极速部署Weaviate&#xff1a;Docker Compose避坑指南 当开发者第一次接触Weaviate时&#xff0c;往往会被官网复杂的配置选项和冗长的文档吓退。作为一款开源的向量数据库&#xff0c;Weaviate确实提供了强大的语义搜索和AI原生功能&#xff0c;但官方安装流程却像迷宫一…...

IDE扩展管理套件:实现配置即代码与团队环境同步

1. 项目概述&#xff1a;一个为开发者定制的IDE扩展管理套件如果你和我一样&#xff0c;每天的工作都离不开各种集成开发环境&#xff08;IDE&#xff09;&#xff0c;比如 Visual Studio Code、IntelliJ IDEA 或者 PyCharm&#xff0c;那你一定对“扩展”或“插件”又爱又恨。…...

【软考高级架构】论文范文20——论软件设计方法及其应用

论软件设计方法及其应用 摘要 软件设计是将需求分析结果转换为软件体系结构和内部实现细节的关键活动,设计方法的选择直接影响系统的可维护性、可扩展性和开发效率。结构化设计、面向对象设计、数据驱动设计等经典方法各有侧重,在不同场景下展现出独特的优势。本文以笔者主…...