关于主线程调用子线程函数发送信号,子线程槽函数进不去问题,绕的冤枉路记录

Qt跨线程信号槽槽函数无响应(未调用)问题 最近在开发中遇到一个很奇怪的问题 ,槽函数与信号连接后,在代码执行中发出信号,槽函数始终进不去。一开始认为是connect调用传参不对,打了下返回值是true,而且在输出中也没有相关warnning输出。再一看跨线程信号槽调用,所以猜测跟多线程有关。排查过程中各种换信号、改参数都没有效果,偶然间把接收对象的创建移至主线程,槽函数居然执行成功了。本着有问题看手册的原则,在手册中找到了如下的说明: 大体意识是说:Qobject对象是有线程归属的,或者说其存活在特定线程中。当接收到队列连接的信或 投递的事件,槽 阅读详情

背景:

1 移植LINUX下C语言的程序到WIN下QT环境,然后再移植到LINUX的QT环境生成执行程序。

2 主线程使用moveToThread()创建子线程。

3 子线程初始化时,创建串口,打开串口,while(true)接收串口数据。

想实现主界面点击按钮,让串口线程发送一包报文。

按以往的经验就是,主线程调用子线程函数,子线程函数内发送信号,自己接收信号进入槽函数进行发送报文,这样可以做到发送在子线程进行不影响主线程。

问题来了:主线程的调用进入到子线程后,没有进入槽函数。

最后发现原因:子线程在初始化时打开了while(true),整个线程处在卡在循环状态,后续再进入的操作都不会触发。

走的冤枉路:1、 首先想到的是连接问题,先去排查了信号槽的建立是否有问题,排查后确定没问题。只要connect参数没错,信号槽参数没错,几乎不会有问题。

2、有可能跨线程导致槽函数没进入。这个也是以前遇到的坑,但是已经特意使用调用子线程函数,然后发信号的方式规避了。

3、最大的坑来了:猜测是否是类的创建有问题,类继承QObject,就不好使。换成有界面类型继承QWidget试了下,发现软件启动卡死,暂时关掉接收循环,发现发送成功了,当时完全搞迷糊了,后来明白了才发现有多低级。

当时在测试换成继承QWidget类时,就预感自己走弯路了,但是实在没想出来原因,只能硬着头皮继续查。最后发现主线程的ID和子线程的ID是一样的,说明根本就没开辟子线程,所以启动while循环时卡死了。说明继承QWidget带UI界面的类,使用moveToThread不好使。

然后发送好使是因为while关掉了,自然好使。

总结:以前使用QT时没发现这个问题,是因为以前使用QT的串口接收,调用的是信号槽,当收到信号readyRead(),就进入槽函数解析。这不同于while循环,不会造成卡死。所以以前的串口接收发送都写到一个cpp里。

现在要移植到linux下的QT,无法使用QT自带的串口类,所以忽略了这个问题。

其次是LINUX下C语言写的串口通讯和C++还是有区别,C语言没有类,可以直接创建一个线程专门供while循环接收数据,而其他发送在线程外。C++是一个线程专门给一个类使用,循环就造成整个类的函数都不能再运行。

AI 与新媒体 AI重构新媒体生态:从生产到分发的全链路变革 AI正成为新媒体领域的核心基础设施,通过五大能力重塑内容产业:自动化生产(AIGC写作/制图/剪辑效率提升5-10倍)、智能分发(算法精准匹配用户)、数据洞察(实时舆情分析)、风险管控(审核效率提升12倍)和运营优化(A/B测试自动化)。这推动行业从"人找内容"转向"内容找人",制作成本下降90%的同时,也带来同质化加剧、版权争议和职业重构等挑战。当前阶段,人机协同成为主流——AI处理标准化生产,人类专注创意与价值观把控。 阅读详情

相关推荐

ISO 26262中的失效率计算:Mission profile的使用

Mission profile:任务剖面,即产品在完成规定任务这段时间内所经历的时间和环境的时序描述;集成电路在工作时环境温度是在不停变化的,同时也存在运行状态和非运行状态;为此标准提出了根据任务剖面(Mission profile)以及集成电路的实际结温来评估热幅度变化、循环温度幅值等因素的影响;汽车电子元器件相关的Mission profile参考IEC TR 62380:Table 11。

weixin_47071127的博客 4816

【已解决】Qt发送信号后,槽函数没有响应

Qt发送信号后,槽函数没有相应,问题解决。

izwmain的博客 2586

Unity Spine动画控制全攻略:播放、回调与停止的实战技巧

本文深入解析Unity中Spine动画的核心控制技巧,涵盖动画播放、轨道分层、事件回调与平滑停止等实战方法。通过封装SpineAnimationController,详细讲解了如何利用动画播放结束回调实现精准的游戏逻辑同步,并提供了避免内存泄漏和动画卡顿的避坑指南,助力开发者打造流畅专业的2D游戏动画系统。

weixin_29021291的博客 381

QT多线程 信号槽收不到信息 Q_OBJECT关键

信号和槽是Qt应用开发的基础,它可是将两个毫无关系的对象连接在一起,槽和普通的C++函数是一样的,只是当它和信号连接在一起后, 当发送信号的时候,槽会自动被调用。只有加入了Q_OBJECT,你才能使用QT中的signal和slot机制。 如在新建线程类的时候很容易忘加Q_OBJECT,导致收不到信息,其实是信号槽没连接上。 我的报错:error LNK2019: 无法解析的外部符号 “public: void __cdecl SimpleThreadOne::LogSend(int)” (?LogSend@

weixin_45086338的博客 1516

动态欧拉角与静态欧拉角:从理论到实践的深度解析

本文深度解析了动态欧拉角与静态欧拉角的核心区别与应用场景。静态欧拉角基于固定世界坐标系,适用于全局导航与三维场景编辑;而动态欧拉角基于物体自身坐标系,更符合飞行模拟、机器人控制等直觉操作,但需警惕其固有的万向节死锁问题。文章通过理论结合实战,帮助开发者在机器人、无人机及图形学项目中正确选用与处理旋转表示。

java5的博客 1074

国科GK7202V300芯片开发避坑指南:从uboot编译到SDK配置的12个实战问题解决

本文针对国科GK7202V300芯片开发过程中的常见难题,提供从uboot编译、SDK配置到系统部署的实战解决方案。详细解析了开发环境搭建、内核编译、驱动模块加载、根文件系统构建及烧写部署等12个关键环节的避坑指南,帮助开发者高效解决编译错误、配置冲突等典型问题,提升开发效率。

sunny的博客 235

QT跨线程信号槽无响应的原因解析

信号槽无法触发的原因,无非就就下面几种: 1.忘记连接信号槽,这种错误十分低级,排查难度一颗星; 2.信号槽中使用了自定义参数(此处应该注意自定义参数是包括数组的,本人在此处吃过一次亏,浪费了半天时间排查),但是没有注册过,应该在开头使用qRegisterMetaType<Mytype>("Mytype");注册,排查难度两颗星; 3.实际槽运行的线程资源被占用,或者是槽所在的对象正在其他的槽响应过程中,这个问题需要带调试排查,排查难度三颗星。 第3点在线程架构设计的时候就需要考虑到这个问题,尽

li3781695的博客 6070

NCCL 核心集体通信操作深度解析:从原理到优化实践

操作逻辑:若 N 个 GPU 各持有一段数据(大小为 S),通信后每个 GPU 会持有所有 N 段数据(总大小为 N×S)。典型场景:多卡推理结果聚合、模型并行中间结果同步。操作逻辑:N 个 GPU 各持有数据,通过归约(求和、取平均等)运算后,所有 GPU 获得相同结果。典型场景:数据并行训练的梯度聚合(如 SGD 优化器)。操作逻辑:N 个 GPU 各持有 N 份数据分片,通信后每个 GPU 获得所有 GPU 的对应分片。典型场景。

jundao1997的专栏 679

QT 多线程信号与槽(二)

一个主线程,一个次线程,主线程向次线程发送信号 mythread.h #include #include class Mythread : public QThread { Q_OBJECT public: Mythread(); protected: void run(); private: public slots: voi

大浪淘沙 1629

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2213

49、非合作目标运动参数估计与状态滤波方法研究

本文研究了非合作空间目标的运动参数估计与状态滤波方法。通过分析目标的章动运动特性,建立了运动方程,并分别提出了基于最小二乘法的质心运动参数估计方法和旋转运动参数估计方法。同时,设计了误差状态卡尔曼滤波器(ESKF)用于姿态滤波和角速度估计,以提高估计精度。仿真实验验证了所提方法的有效性,能够准确估计目标的运动参数和状态信息,为在轨服务提供了技术支持。

gpt4scribbler的博客 90

子线程发送信号,主线程中执行槽函数

信号与槽: //conncect(谁,发出了什么信号,谁,执行什么操作); conncet(this->ui->btnLogin, SIGNAL(clicked(bool)), this, SLOT(login())); 子线程发送信号,主线程中执行槽函数。示例代码如下: qthread.h #ifndef QTTESTTHREAD_H #define QTTESTTHREAD_H #include <QThread> class QtTestThread:public QTh

sunny_xiaot的博客 1351

uniapp [全端兼容] - 详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,免费自动提示引导动作及语音,提供提供实名认证、身份证识别、人脸信息采集、刷脸扫脸认证示例代码

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,人脸识别,扫脸认证,人脸认证,活体认证,身份认证,uni-app人脸识别详细教程,如何在app端实现免费人脸识别教程,如何在小程序端做,最好用的插件,安卓ios百度人脸识别、活体检测、人脸采集APP,H5人脸识别带前后摄像头,适合新手看的人脸识别功能教程,详细示例代码源码,有没有免费的,接入百度,阿里云人脸识别,百度,api,活体检测,数据采集,动作提示指引,语音提示指引,报错,无法核验一直出错,根本用

🏆 前端领域优质创作者 1万+

QT 信号/槽与事件循环的关系

常见的信号槽的绑定如下: QObject::connect(&sender,&Sender::SignalFunc,&receiver,Receiver::SlotFunc,Qt::AutoConnection); //Qt::AutoConnection 为默认选项 关于槽函数最终是在哪个线程执行的,引用一段说明: https://www.cnblogs.com/findumars/p/5031239.html 1、自动连接(Auto Connection) 这是默

yuanshenqiang的博客 1909

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Qt多线程间信号槽传递非QObject类型对象的参数

多线程间需要传递信号给另外一个线程的槽,而信号和槽所使用的参数为非QObject,无论其是stl的标准库类型还是其他类型,都必须先注册,否则信号发送了,槽将会始终不调用。 注册方式如下: #include  //该文件为qRegisterMetaType所在头文件,也可以使用 #include 此头文件包括了所有的qt类型头文件 qRegisterMetaType("type"); 如我

qqwangfan的专栏 3472

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

QT:信号发送了,槽函数没有响应

解决办法四步法

qq_43570115的博客 8709

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

QT中多线程之间无法发送信号的问题

QT多线程之间的消息发送问题解决

yao51011010的专栏 2665

qt信号槽接收不到的情况(自定义数据类型+多线程)

一般的基本数据类型,qt都认识,包括QString,所以信号和槽一般都可以正常使用。 今天发现一种情况,如果信号的参数是自定义的数据类型,并且在不同的线程中被发送,对应的槽就不会收到。 当然也有解决办法 直接看例子: a.h #include #include struct Info { Info(int age = 0, const QString &name =

ndzjx的专栏 5943

QT在子线程发送信号给主线程,主线程信号槽函数没有反应的解决办法

问题描述:子线程发送信号给主线程,主线程信号槽函数没有反应。 在子线程的run函数发送了一个信号,在主函数中定义了一个信号槽函数用来响应这个信号,但是槽函数不执行,修改了connect的第五个选项也不行,编译也没有问题 解决方法: 子线程在主函数的构造函数中实例化,connect,槽函数接收消息正常。 子线程类在一个函数中实例化,connect,槽函数收不到消息。 ...

透明 3020

在Qt中线程间connect收不到signal的问题。

例如使用QObject::connect( video_frame_process, SIGNAL(ImageReady(cv::Mat )),this, SLOT(ShowImage(cv::Mat))); 编译没问题,但运行的时候发现收不到ImageReady的signal,没有触发ShowImage,查看debug的output会看到 Make sure 'cv::Mat' is reg

neverwsk的专栏 2869

关于QTmovetothread失败的个人经历

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_43559429的博客 1204

QT信号槽连接但不进槽函数问题

信号槽 不进槽函数 解决方法

雒珣的博客 4677

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。

专注于 Qt/C++ 应用开发和机器视觉领域的开源项目分享。期待与您共同进步! 1817

关于QT信号发送失败的另个原因分析

在上面的代码中,我们使用了一个名为 qRegisterMetaType 的函数来注册我们的结构体。我们通过传递结构体的类型参数来注册我们的数据类型。值得注意的是,qRegisterMetaType 函数在程序启动时只会执行一次,因此我们需要确保在需要使用自定义数据类型的地方正确地引入了它。2、绑定的消息,如果参数为自定义的数据体,则需要进行注册数据体,系统默认常用的类型变量,如果自定义结构体,则需创建连接之间注册一次,语法:qRegisterMetaType("MyStruct ")

yao51011010的专栏 1396

QT子线程循环执行任务,子线程信号槽无法被触发

在主线程下开启了一个子线程,子线程循环执行任务,当主线程给子线程发送信号时,无法触发子线程的信号槽。 子线程代码: #include "childThread.h" childThread::childThread() { //构造函数 } hildThread::work() { while(true) { //do something } } on_sigFromMain() { qDebug()<<"recv a sign

weixin_30072103的博客 2129

Qt slot和signal参数为指针或者结构体时,采用Qt::QueueConnect方式接收不到响应问题总结

项目中为了减少响应卡顿问题,对于一些signal事件进行设置Qt::QueueConnect方式进行消息队列形式的signal发送,但是当signal参数为std::string 或者结构体数据是会出现接收不到响应信号的问题。经测试当结构体为局部变量的时候,会出现这种情况。 这种现象产生的原因是局部变量当函数结束的时候,会被销毁,所以数据就被清掉了。如果采用这种Qt::QueueConnect的...

wangdong770909027的博客 2719
上一篇: UDP通讯获取的IP前有ffff的标记,去掉的方法
dfcsdn_
博客等级 码龄4年 11粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值