QTcpSocket readyRead()信号多次发出

时间:2016-01-02 09:23:00

标签: qt signals qtcpsocket slots qtcpserver

我是Qt的新手,目前正在学习使用QTcpServerQTcpSocket进行编码。

我处理数据的代码就像

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

void MyClass::processData()
{
  /* Process the data which may be time-consuming */
}

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

或者你能提供一些我应该采用的好方法吗?

1 个答案:

答案 0 :(得分:1)

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

因此,当您的应用程序忙于执行代码时,应用程序似乎没有响应,因为它无法响应外部事件,因此processData()如果某些数据无法调用QPushButton在套接字上收到,直到当前函数(可能包含重代码)返回,并且控件返回事件循环,必须处理排队事件(这些事件可能包含在套接字上接收的数据,或者用户点击某些UILabel等。)

简而言之,这就是为什么你总是要让你的代码尽可能简短和优化,以免长时间阻止事件循环。

  

随着事件传递的停滞,小部件不会自行更新(QPaintEvent对象将位于队列中),不能与小部件进一步交互(出于同样的原因),定时器不会被激活和联网通讯将减速并停止。此外,许多窗口管理器会检测到您的应用程序不再处理事件,并告诉用户您的应用程序没有响应。这就是为什么快速响应事件并尽快返回事件循环这么重要的原因!

请参阅https://wiki.qt.io/Threads_Events_QObjects