QTcpSocket readyRead() 信号多次发出

Posted

技术标签:

【中文标题】QTcpSocket readyRead() 信号多次发出【英文标题】:QTcpSocket readyRead() signal emits multiple times 【发布时间】:2016-01-02 09:22:59 【问题描述】:

我是 Qt 新手,目前正在学习使用 QTcpServerQTcpSocket 编写代码。

我处理数据的代码是这样的

Myclass() 

   connect(&socket, &QTcpSocket::readyRead, this, &MyClass::processData);


void MyClass::processData()

  /* Process the data which may be time-consuming */

这样使用信号是否正确?当我阅读文档时,在同一个线程中立即调用插槽,这意味着如果我的处理工作尚未完成并且新数据到来,Qt 将暂停当前工作并再次输入processData()。这不是我想要做的,所以我应该在信号/插槽连接中QueueConnection 吗?

或者您能否提供一些我应该在这种情况下采用的好方法?

【问题讨论】:

【参考方案1】:

Qt 不会在数据进入时暂停你当前的工作,它只会在事件循环空闲并等待新事件时调用processData()

所以,当您的应用程序忙于执行您的代码时,应用程序会显得无响应,因为它无法响应外部事件,因此如果在套接字上接收到一些数据,processData() 将不会被调用,直到当前函数(可能包含您的繁重代码)返回,并且控件返回到事件循环中,该循环必须处理排队的事件(这些事件可能包含套接字上接收到的数据,或者用户单击某些@987654324 @等)。

简而言之,这就是为什么您总是必须使代码尽可能短和优化,以免长时间阻塞事件循环。

由于事件传递被卡住,小部件不会自我更新(QPaintEvent 对象将位于队列中),无法与小部件进行进一步交互(出于同样的原因),计时器不会触发并且网络通信会变慢并停下来。此外,许多窗口管理器会检测到您的应用程序不再处理事件并告诉用户您的应用程序没有响应。这就是为什么快速响应事件并尽快返回事件循环如此重要的原因!

见https://wiki.qt.io/Threads_Events_QObjects

【讨论】:

以上是关于QTcpSocket readyRead() 信号多次发出的主要内容,如果未能解决你的问题,请参考以下文章

QTcpSocket readyRead() 信号多次发出

QTcpSocket类中的ReadyRead()信号没有被触发

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

为啥在 Qtcpsocket 的 readyRead 回调中调用 readAll 时没有内容?

QTcpSocket的连续发送数据和连续接收数据

qtcpsocket只能接收8KB字节的数据,该怎么解决