QTcpSocket断开重连后调用write后奔溃问题解决方案

当客户端断开后调用connectToHost重连服务器成功后调用write发送数据会导致程序奔溃,找了好久最后发现是信号和槽连接方式有问题。

原来是:

cpp 复制代码
    connect(this->electricBoxSocketClient,&QTcpSocket::disconnected,this,
            [=]()
            {
                emit deviceErrorSignal(0,true,true,"连接断开");
            });

修改为:

c 复制代码
    connect(this->electricBoxSocketClient,&QTcpSocket::disconnected,this,
            [=]()
            {
                emit deviceErrorSignal(0,true,true,"连接断开");
            },Qt::QueuedConnection);

就合适了。

disconnected信号与槽的连接方式改为Qt::QueuedConnection

Qt::QueuedConnection连接方式介绍:

在Qt中,Qt::QueuedConnection是一种信号与槽的连接方式,它指示信号与槽之间的通信通过事件队列进行,即发送信号的对象会将信号发送到事件队列中,然后由事件循环来处理并调用槽函数。

使用Qt::QueuedConnection时,信号发出时不会直接调用连接的槽函数,而是将一个事件放入接收者对象的事件队列中。在事件循环中处理事件时,会依次调用事件队列中的槽函数。

这种连接方式主要用于不同线程间的通信,因为Qt的跨线程通信是通过事件分发机制实现的。Qt::QueuedConnection还可以用于线程内部的通信,以确保信号与槽的调用都在事件循环中进行,避免了多线程并发访问的问题。

需要注意的是,Qt::QueuedConnection并不保证信号和槽函数的执行顺序,因为它们是在不同的事件循环中执行的。如果需要保证执行顺序,可以考虑使用Qt::BlockingQueuedConnection连接方式。

使用Qt::QueuedConnection的语法如下:

cpp 复制代码
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::QueuedConnection);

其中,sender是发送信号的对象,signal是发送的信号,receiver是接收信号的对象,slot是接收信号的槽函数。最后一个参数Qt::QueuedConnection表示使用Qt::QueuedConnection连接方式。

相关推荐
是店小二呀9 小时前
鸿蒙PC_Dart-Sass-ohos适配全记录
linux·运维·windows
智能运维指南15 小时前
代码管理软件如何融入 DevOps 工具链?全链路联通的 5 个关键点
运维·devops·信创适配·嘉为蓝鲸
两点王爷15 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷16 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
充电zcx16 小时前
Linux:4:开发工具详解
linux·运维·服务器
梦帮科技16 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
TDengine (老段)17 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
gongfeng300019 小时前
福州企业级AI自动化获客解决方案品牌梳理与适用场景分析
运维·人工智能·自动化·g-claw ai员工
螺蛳粉 螺蛳粉20 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
光电笑映21 小时前
网络通信基础:从协议分层到 Socket 编程预备
linux·运维·服务器·网络