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

相关推荐
彩虹糖_haha32 分钟前
Linux高并发服务器开发 第五天(压缩解压缩/vim编辑器/查找替换/分屏操作/vim的配置)
linux·运维·服务器
旺仔学IT32 分钟前
Centos7中使用yum命令时候报错 “Could not resolve host: mirrorlist.centos.org; 未知的错误“
linux·运维·centos
ROCKY_81734 分钟前
Mysql复习(二)
数据库·mysql·oracle
qq_433618442 小时前
shell 编程(五)
linux·运维·服务器
VVVVWeiYee2 小时前
项目2路由交换
运维·服务器·网络·网络协议·信息与通信
lifeng43213 小时前
Jenkins集成部署(图文教程、超级详细)
运维·jenkins
问道飞鱼3 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
HaiFan.3 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
水根LP493 小时前
linux系统上SQLPLUS的重“大”发现
数据库·oracle
白手小弟4 小时前
python wxauto库实现微信自动化发送信息、回复、添加好友等
运维·自动化