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

【qt信号槽-6】槽函数不执行的一种原因——未知线程

背景:

项目需要调用第三方库,又要涉及多线程,遇到了在connect成功之后,槽函数依然不执行的情况。按照常理,槽函数不执行无非就几种情况:

要么connect未成功。

要么disconnect,或者对象被销毁后自动断开连接。

要么名称冲突,被扰乱秩序,包括但不限于函数名,对象名。之前写过一篇有关“提升界面”命名导致槽函数不执行的记录。本质还是connect混乱导致。

其实再有其它原因,根本还是与qt元对象实现信号槽的细节有关,万变不离其宗。

之前刚这样自信满满叨叨过,这次就遇到了奇葩,特此分享。

先说结论,诡异的子线程,有可能导致槽函数失灵。

【qt信号槽-1】槽函数重写问题,qt_metacall和qt_static_metacall_qt metacall

【qt信号槽-2】Qt中窗体继承,槽响应多次执行的解决_qt界面继承 槽函数多次执行

【qt信号槽-3】(QObject::connect: No such slot)的一种解决方法,connect函数qt4/qt5格式,元数据注册

【qt信号槽-4】槽函数不响应不执行的一种原因:ui提升导致重名_qt 按钮不能进入函数

【qt信号槽-5】信号槽相关注意事项记录

【qt信号槽-6】槽函数不执行的一种原因——未知线程

未知子线程:

先介绍一下我用到的这个第三方库,就是个dll,它用于驱动采集卡。其中有个接口,需要传入函数指针,使用回调的方式实现“插拔响应”。换句话说,当设备插拔时,会触发传入的这个函数。类似于槽函数。为后面叙述方便,先叫它“插拔函数”。

当设备插拔时,我希望更新界面状态。起初直接从这个插拔函数直接调用更新界面的函数,能用,但是qt会报错。提示不能跨线程更新界面。关于这点,插入话题。其实vs的c#里也是这样的,只不过qt提倡使用信号槽,c#是有个异步回调。终归应该都是为了线程安全这个规矩。

所以,这个诡异的子线程一定是存在的。

槽函数问题:

为了实现程序支持多个设备,我想在插拔时进行处理。插入设备就new一个管理对象,拔出设备就delete它。

结果就出问题了。这个new的对象,发出的信号可以被处理,而接受信号的槽全歇菜了。已经反复确认没有传统的那些问题,明明connect已经成功返回true,delete或deleteLater没有意外执行,甚至对象树也没有连带响应,...。还能咋地?

最终为了尝试对象树的连带关系,new时指定了parent确保万无一失。结果就报错了。一下子豁然开朗。记得在写多线程时,moveToThread之前要setParent(nullptr),终归还是跟线程实现原理有关,比如消息队列,ownership。所以一旦代码运行到线程里,就涉及这些。最终尝试把new这段代码拿出来放在自己能控制的线程里(比如ui线程,或者自己new的线程),槽函数正常了。

反思:

为什么发出信号没问题,只有槽函数出问题呢?因为发信号是通知别人,而槽函数是基于事件循环的响应,本质上是对消息队列的处理。而所谓线程,最重要的就是消息队列的附加。这点看qt源码可以得到证实。

因此,万一那个三方库里有关线程的部分,哪里影响了消息队列。就会导致槽函数不执行。比如,那个三方库里的线程,可能就运行那一下,进而销毁了,那么相关消息队列也就失效了,所以在这个线程里new的对象,它的那些槽函数,是基于当前线程消息队列的,线程的消息队列一旦崩塌,槽函数也就失效了。

其实这个问题我并没有深究,因为不知道那个三方库里的线程到底怎么回事。就说它调用的os接口,那么原理上也是消息队列和ownership,当然ownership这点手册里没有看到说明,但可以随便写一段代码证实。我验证的结果是,moveToThread只是追加到消息队列,并不会take the ownership。亦即,适当的时候要delete。

总结:

综上所述,我觉得我基本上猜透了问题的原因,不对之处,各位多指正。

本文完。

 

 

 

相关文章:

【qt信号槽-6】槽函数不执行的一种原因——未知线程

背景: 项目需要调用第三方库,又要涉及多线程,遇到了在connect成功之后,槽函数依然不执行的情况。按照常理,槽函数不执行无非就几种情况: 要么connect未成功。 要么disconnect,或者对象被销毁…...

Leetcode面试经典150题-162.寻找峰值

解法都在代码里,不懂就留言或者私信 想清楚的话会特别简单,你可能想不到这是个二分。。。 class Solution {/**本题题目规定我们只能用O(logN)的时间复杂度来解题,这显然就是让二分嘛而题目给的数组本身是无需,怎么二分呢其实我…...

Vue组件:模板引用ref属性的使用

Vue 组件系列文章: 《Vue组件:创建组件、注册组件、使用组件》 《Vue组件:使用Prop实现父组件向子组件传递数据》 《Vue组件:使用$emit()方法监听子组件事件》 《Vue组件:插槽》 《Vue组件:混入》 《Vue组件…...

robomimic基础教程(一)——基本概念

robosuite和robomimic都是由ARISE Initiative开发的开源工具,旨在推进机器人学习和机器人操作领域的研究。 一、基本概念 robomimic是一个用于机器人示范学习的框架。它提供了在机器人操作领域收集的大量示范数据集,以及用于从这些数据集中学习的离线学…...

7天速成前端 ------学习日志 (继苍穹外卖之后)

前端速成计划总结: 全26h课程,包含html,css,js,vue3,预计7天内学完。 起始日期:9.16 预计截止:9.22 每日更新,学完为止。 学前计划 课…...

讲课研判:基于教师上课视频文件的综合分析

在教育评估与改进的过程中,对教师上课视频文件进行详尽的研判是一项至关重要的工作。它不仅能够帮助教师自我反思、提升教学质量,还能为教育管理者提供决策依据,促进教育教学的整体优化。本文将从教学目标、教学内容、教学效果、教学能力、教…...

mac 如何开启指定端口供外部访问?

前言 需要 mac 上开放指定端口,指定 ip 访问 解决 在 macOS 上开放一个端口,并指定只能特定的 IP 访问,可以使用 macOS 内置的 pfctl(Packet Filter)工具来实现。 1、 编辑 pf 配置文件: 打开 /etc/pf.conf 文件进行编辑。 可以使…...

Weblogic部署

要安装weblogic,首先要有java环境,因此需要先安装jdk。 这里需要注意,weblogic版本不同,对应的jdk版本也不同,我在这里就踩了很多坑,我这里下载的是fmw_12.2.1.4.0_wls_lite_generic.jar对应的是jdk-8u333…...

面向对象设计的五大原则(SOLID 原则)

面向对象设计的五大原则(SOLID 原则)是指导我们设计可维护、灵活且易扩展的面向对象系统的核心准则。这些原则帮助开发者避免常见的设计陷阱,使代码更具可读性和可维护性。 0.设计原则和设计模式的关系 设计原则(Design Princip…...

Python和MATLAB及C++信噪比导图(算法模型)

🎯要点 视频图像修复模数转换中混合信号链噪音测量频谱计算和量化周期性视觉刺激脑电图高斯噪声的矩形脉冲 总谐波失真 周期图功率谱密度各种心率失常检测算法胶体悬浮液跟踪检测计算交通监控摄像头图像噪音计算 Python信噪比 信噪比是科学和工程中使用的一种测…...

App及web反编译方案

APP反编译代码的工具下载: 下载地址:APK逆向三件套apktool-2.9.3.jar,dex2jar-2.0.zip,jd-gui-windows-1.6.6资源-CSDN文库 》dex2jar: 把dex文件转成jar文件 》 jd-gui: 这个工具用于将jar文件转换成java代码 》APKTool: 首先把…...

学成在线练习(HTML+CSS)

准备工作 项目目录 内部包含当前网站的所有素材,包含 HTML、CSS、图片、JavaScript等等 1.由于元素具有一些默认样式,可能是我们写网页过程中根本不需要的,所有我们可以在写代码之前就将其清除 base.css /* 基础公共样式:清除…...

istio中使用serviceentry结合egressgateway实现多版本路由

假设有一个外部服务,外部服务ip为:10.10.102.90,其中32033为v1版本,32034为v2版本。 现在需要把这个服务引入到istio中,使用egressgateway转发访问该服务的流量,并且需要实现多版本路由,使得he…...

Java项目——苍穹外卖(二)

Redis 简介 Redis是一个基于内存的key-value结构数据库 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 基础操作 启动 在redis安装目录中打开cmd,输入如上图指令即可启动,按下crtl…...

【Python日志功能】三.日志记录方法与多模块日志

文章目录 相关链接第三篇:日志记录方法与多模块日志1 基本日志记录方法2 在多个模块中使用日志3 文章总结 相关链接 【Python日志功能】一.日志基础与基本配置【Python日志功能】二.高级配置与日志处理器【Python日志功能】三.日志记录方法与多模块日志官方文档&am…...

在pycharm终端中运行pip命令安装模块时,出现了“你要如何打开这个文件”弹出窗口,是什么状况?

这种情况发生在Windows系统上,当在PyCharm终端中运行pip命令安装模块时,如果系统无法确定要使用哪个程序打开该文件,就会出现“你要如何打开这个文件”弹出窗口。 解决方法是: 选择“查找一个应用于此文件”的选项。在弹出的窗口…...

Axure多人协调的方式

当系统有多个模块,又由不同的产品经理负责设计,如何进行协调? 尝试过的方法 1)搭建Axure私服,用Axure的私服进行一个RP文件多人协同编辑; 2)用SVN管理RP文件,每次都要合并。 以上…...

【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程

【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【OnnxRuntime】【Python】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转on…...

React学习笔记(1.0)

在使用vite创建react时,有一个语言选项,就是typescript-SWC,这里介绍一下SWC。 SWC:可扩展的Rust的平台,用于下一代快速开发工具,SWC比Babel快20倍。 简单来说,就是用于格式转换的&#xff0c…...

Axure RP实战:打造高效图形旋转验证码

Axure RP实战:打造高效图形旋转验证码 在数字产品设计的海洋中,验证码环节往往是用户交互体验的细微之处,却承载着验证用户身份的重要任务。 传统的文本验证码虽然简单直接,但随着用户需求的提高和设计趋势的发展,它…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...