QT多线程中使用QTcpSocket遇到的读写数据问题

摘要:
我在QThread的子类WorkerThread中使用QTcpSocket来连接TCP服务器并给服务器发送数据。;m_pTcpSocket-˃connectToHost;  //连接服务器m_pTcpSocket-˃waitForConnected;            //等待确保连接成功intnByteWrite=m_pTcpSocket-˃write;//发送数据到服务器}}可以连接到服务器,但是调用write发送数据时,服务端一直接收不到,表示这里发送失败了,客户端发不出数据了~解决:后来在使用完write()方法后,再使用flush()方法,就可以发送消息了。估计QTcpSocket中的write()方法是带有缓冲的。

多线程中使用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服务器并给服务器发送数据。
void WorkerThread::run()
{
m_pTcpSocket = new QTcpSocket();
while (1) {
…;
m_pTcpSocket->connectToHost(QHostAddress::LocalHost, 8001);  // 连接服务器
m_pTcpSocket->waitForConnected(3000);             // 等待确保连接成功
int nByteWrite = m_pTcpSocket->write(strMessage.toUtf8()); // 发送数据到服务器
}
}
可以连接到服务器,但是调用write发送数据时,服务端一直接收不到,表示这里发送失败了,客户端发不出数据了~
解决
后来在使用完write()方法后,再使用flush()方法,就可以发送消息了。
qt的官方文档里说,调用了flush()方法后,可以把缓冲的数据立刻发送出去。
估计QTcpSocket中的write()方法是带有缓冲的。
void WorkerThread::run()
{
m_pTcpSocket = new QTcpSocket();
while (1) {
…;
m_pTcpSocket->connectToHost(QHostAddress::LocalHost, 8001);
m_pTcpSocket->waitForConnected(3000);
int nByteWrite = m_pTcpSocket->write(strMessage.toUtf8());
m_pTcpSocket->flush();
}
}

上面的客户端TcpSocket成功地将数据write发送给了服务端,但是又发现客户端readyRead信号一直不进它的槽函数sloat_RecvData()。真是一波刚平一波又起啊,现在客户端又收不到数据了~
解决
检查connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(update_message()));返回值为true,说明信号槽连接起来了~
服务端检查write函数的返回值,为非零,说明也发出去了~
线程while(1)循环很快,在该循环中,循环过快,导致connect来不及处理数据,所以使用waitForReadyRead()将循环进行阻塞,当有数据读入时取消阻塞,进入下一轮循环。
void WorkerThread::run()
{
m_pTcpSocket = new QTcpSocket();
while (1) {
…;
m_pTcpSocket->connectToHost(QHostAddress::LocalHost, 8001);
m_pTcpSocket->waitForConnected(3000);
int nByteWrite = m_pTcpSocket->write(strMessage.toUtf8());
m_pTcpSocket->flush();
m_pSocket->waitForReadyRead();
}
}

在多线程中是socket,确实挺棘手的!记录一下,仅供参考~

免责声明:文章转载自《QT多线程中使用QTcpSocket遇到的读写数据问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇golang的安装后的文件目录解析迷你MVVM框架 avalonjs 入门教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java多线程案例

packagecom.alibaba.yuntu.me.biz.district.service.impl.MyUtis; importcom.alibaba.fastjson.JSONObject; importcom.alibaba.yuntu.me.common.base.util.HttpUtil; importlombok.SneakyThro...

windows qt 使用c++ posix接口编写多线程程序(真神奇)good

一、多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行。多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径,C++ 不包含多...

C#多线程中等待线程池中的所有线程执行完毕后再执行下一个线程

网上找的,做个笔记记录一下。 有这么一个需求,就是巡检多台服务器是否都在线,点击巡检按钮后,按行读取DataGridView中的数据,并启行线程执行,这时会存在多个线程同时运行,但是什么时候给出用户提醒,说都巡检完成了呢,需要用到一个线程状态的检测。 最后的效果是这样子的,多个线程对表格按行进行服务器的巡检,只有等所有的巡检线都结束后,等待线程才会弹出一个...

多线程中的lua同步问题

最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定。经过简单分析之后,确定是线程同步的问题。于是便修改了线程通信的代码,并使用pthread_mutex_lock/unlock来防止冲突。重新编译后,崩溃频率有所减少。但是每运行约四十次...

编写多线程代码时,启动线程后等待线程结束方法

在编写多线程代码时,如果主线程结束,那么子线程也会随之结束,如何等待线程结束再往下执行。   等待线程执行完成代码。   线程代码:   package demo; import java.util.concurrent.CountDownLatch; public class NodeSqlThread1 implements Runnable{    ...

浅谈 linux 多线程编程和 windows 多线程编程的异同

原文:http://software.intel.com/zh-cn/blogs/2011/03/24/linux-windows/ 很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他...