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连接方式。

相关推荐
Thera77711 分钟前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++
阿梦Anmory16 分钟前
Ubuntu配置代理最详细教程
linux·运维·ubuntu
呉師傅30 分钟前
【使用技巧】Adobe Photoshop 2024调整缩放与布局125%后出现点菜单项漂移问题的简单处理
运维·服务器·windows·adobe·电脑·photoshop
heartbeat..33 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
玄同76537 分钟前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码39 分钟前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql
chian-ocean40 分钟前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer
小Tomkk1 小时前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
赌博羊1 小时前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
getapi1 小时前
Ubuntu 22.04 服务器的系统架构是否为 amd64 x86_64
linux·服务器·ubuntu