我是Qt的新手,目前正在学习使用QTcpServer
和QTcpSocket
进行编码。
我处理数据的代码就像
Myclass()
{
connect(&socket, &QTcpSocket::readyRead, this, &MyClass::processData);
}
void MyClass::processData()
{
/* Process the data which may be time-consuming */
}
这样使用信号的正确方法是什么?当我正在阅读文档时,在同一个线程中立即调用插槽,这意味着如果我的处理工作尚未完成并且新数据到来,Qt将暂停当前工作并输入{{1再次。这不是我想要做的,那么我应该在信号/插槽连接中processData()
吗?
或者你能提供一些我应该采用的好方法吗?
答案 0 :(得分:1)
当数据进入时,Qt不会暂停当前的工作,只有在事件循环空闲并等待新事件时才会调用processData()
。
因此,当您的应用程序忙于执行代码时,应用程序似乎没有响应,因为它无法响应外部事件,因此processData()
如果某些数据无法调用QPushButton
在套接字上收到,直到当前函数(可能包含重代码)返回,并且控件返回事件循环,必须处理排队事件(这些事件可能包含在套接字上接收的数据,或者用户点击某些UILabel
等。)
简而言之,这就是为什么你总是要让你的代码尽可能简短和优化,以免长时间阻止事件循环。
随着事件传递的停滞,小部件不会自行更新(QPaintEvent对象将位于队列中),不能与小部件进一步交互(出于同样的原因),定时器不会被激活和联网通讯将减速并停止。此外,许多窗口管理器会检测到您的应用程序不再处理事件,并告诉用户您的应用程序没有响应。这就是为什么快速响应事件并尽快返回事件循环这么重要的原因!