Qt TCP Socket读取问题
Posted
技术标签:
【中文标题】Qt TCP Socket读取问题【英文标题】:Qt TCP Socket reading issue 【发布时间】:2015-02-26 10:36:37 【问题描述】:我尝试使用 Qt 库和 GUI 程序读取 TCP 端口。
问题是当我使用这段代码读取套接字时:
QTcpSocket *a = new QTcpSocket();
a->connectToHost("127.0.0.1", 5000);
a->read(data,LEN);
它不起作用,我需要添加一个额外的功能:
a->waitForReadyRead(1)
但是这个函数会减慢我的程序,我使用pthread
来连续运行这个代码。我有一个问题,我怎样才能加快我的程序并成功读取数据?
【问题讨论】:
【参考方案1】:您需要使用 Qt 事件循环并连接“可用数据”事件信号才能异步读取套接字数据。您的连接语法可能如下所示:
QObject::connect(s, &QTcpSocket::readyRead, yourReaderFunction);
您的程序循环应该包含对事件处理函数QApplication::processEvents()
的调用,或者您可以使用内置循环QApplication::exec()
。
信号和槽机制是Qt的核心特性,你需要正确理解和使用它才能与大多数Qt类进行交互:
Signal and slot basics
Qt5 new signal and slot syntax
【讨论】:
我知道你是什么意思,我用这种方式但是在一个线程中我认为我无法访问其余程序的内存。 另外一个问题是,当读取运行速度快于进程并且连接事件信号不在要同步的线程中时,我是否会丢失数据? @ntosis 您可能想要编辑您的问题以显示线程代码。您可以仅从创建套接字的线程访问套接字(因为 Qt 将assert
否则,无论您的互斥或其他自旋线程安全功能如何),而且制作起来并非易事确保在您认为的线程中创建套接字,并为排队的连接使用正确的事件循环和上下文。
@NicolasHolthaus 我做了一些测试,它正在工作,我可以复制数据,但是信号 readyRead 在很长一段时间后发出,这非常糟糕。我认为它不是来自 Qt 但我使用 Rtl_Tcp 脚本我认为这个脚本很慢或者我这次无法想象的东西。
@ntosis 这已经远远超出了您最初问题的范围。如果您需要其他帮助,我无法从您所说的内容中判断出来,但如果需要,您可能需要提出另一个包含所有相关信息的问题。以上是关于Qt TCP Socket读取问题的主要内容,如果未能解决你的问题,请参考以下文章
Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端