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

QTcpSocket多线程遇到的读写数据问题

尝试用多线程使用QTcpSocket
run()方法中new QTcpSocket;然后监听readyRead()信号connect(m_pTcpSocket,SIGNAL(readyRead()),this,SLOT(sloat_RecvData()));

问题是当需要给服务器发送一段命令时(使用m_pTcpSocket->write(byteArray);)程序会报出警告QSocketNotifier: socket notifiers cannot be enabled from another thread。
我在QThread的子类WorkerThread中使用QTcpSocket来连接TCP服务器并给服务器发送数据。

主窗口代码

MyServer::MyServer(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);ui.port->setText("8899");setWindowTitle("服务器");//创建监听的服务器对象my_server = new QTcpServer(this);recv_worker = new RecvData;work_thread = new QThread;recv_worker->moveToThread(work_thread);connect(my_server, &QTcpServer::newConnection, this, [=]() {recv_worker->GetTcpSocket(my_server->nextPendingConnection());m_status->setPixmap(QPixmap(":/MyServer/connect.png").scaled(20, 20));});connect(recv_worker, &RecvData::recv_msg_signal, this, &MyServer::RecvMsg);connect(this, &MyServer::send_msg_signals, recv_worker, &RecvData::SendMsg);//状态栏m_status = new QLabel;m_status->setPixmap(QPixmap(":/MyServer/disconnect.png").scaled(20,20));ui.statusBar->addWidget(new QLabel("连接状态:"));ui.statusBar->addWidget(m_status);work_thread->start();
}

功能类

RecvData::RecvData(QObject *parent): QObject(parent)
{}RecvData::~RecvData()
{}void RecvData::GetTcpSocket(QTcpSocket* tcp)
{my_tcp = tcp;//检测是否可以接收数据connect(my_tcp, &QTcpSocket::readyRead, this, [=]() {QByteArray data = my_tcp->readAll();emit recv_msg_signal("客户端say:" + data);});connect(my_tcp, &QTcpSocket::disconnected, this, [=]() {my_tcp->close();my_tcp->deleteLater();emit socket_disconnected_signal();});//connect(my_tcp, &QTcpSocket::readyRead, this, &RecvData::RecvFile);
}
void RecvData::SendMsg(QString msg)
{my_tcp->write(msg.toUtf8());
}

可以连接到服务器,但是先调用write发送数据后,readyRead信号一直不进它的槽函数sloat_RecvData()。表示这里发送失败了,客户端发不出数据了~
解决:
后来在使用完write()方法后,再使用flush()方法,就可以获取readyRead信号了。
qt的官方文档里说,调用了flush()方法后,可以把缓冲的数据立刻发送出去。
估计QTcpSocket中的write()方法是带有缓冲的,将接收部分阻塞了。

void RecvData::SendMsg(QString msg)
{my_tcp->write(msg.toUtf8());my_tcp->flush();
}
http://www.xdnf.cn/news/39133.html

相关文章:

  • win11自带中文输入法不见了怎么解决
  • 2025年4月19日 记录大模型出现的计算问题
  • 洛谷B3862:图的遍历(简单版)← 链式前向星
  • Bash 中的数学运算详解
  • 共享单车出行规律与决定因素的空间交互分析——以北京六大区为例
  • 详解多线程高并发IOCP开发模式(含示例说明)
  • 深入解析 JDK jstack 命令:线程分析的利器
  • 数据结构初阶:二叉树(三)
  • PHP异常处理__RuntimeException运行时错误
  • PDF转excel+json ,vue3+SpringBoot在线演示+附带源码
  • 作业2 CNN实现手写数字识别
  • 深度学习--卷积神经网络CNN原理
  • ubuntu18.04安装QT问题汇总
  • NBA 特刊官方报名系统-Overview of NBA Special Issue Official Registration Syste
  • 爬取B站视频弹幕的简易教程(上)
  • AI 提示词教程:从新手到高手的进阶之路
  • Kubernetes相关的名词解释CoreDNS插件(2)
  • MySQL事务
  • 【训练】Datawhale AI春训营 发电功率预测
  • MySQL基础安装和学习
  • Javaweb之javascript的详细解析
  • 代码随想录打家劫舍+树形DP入门
  • docker安装mysqld-exporter
  • 大数据应用开发——大数据平台集群部署(三)
  • Tracepoints for the VFS?
  • 【单倍型理解及计算系列之三】怎么确定单倍型以及软件参数
  • RS232实现主单从多通讯
  • PTA | 与零交换
  • 220V转DC3V-3.2VLED供电WT5105
  • Nacos配置中心服务端源码解析