我正在做:
connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(onTCPDataArrived()), Qt::QueuedConnection);
但是调用插槽的时间远远少于应有的时间。
它似乎错过了很多信号,可能是因为插槽需要很长时间(确实如此)。
我在tcp写入之间在传输端添加了2ms的延迟并且它变得更好:插槽被调用更多。
问题:如果信号和插槽在同一个线程中,当插槽已经运行时,接收器仍然排队输入信号?
答案 0 :(得分:2)
使用TCP / IP,从不可以保证数据如何在接收端被斩波为数据包。因此,您可以“一次性”发送10个字节,并允许接收端接收10个通知(每个字节一个)和0个通知之间的任何地方。为什么零?因为此后很快你可能会发送另外10个字节,并且所有20个字节都会有一个通知。这与Qt完全无关。
因此,当readyRead()
触发时,您必须读取所有可供阅读的数据。您将不再次收到有关此数据的通知。
答案 1 :(得分:0)
Qt::QueuedConnection documentation规定
当控制返回到的事件循环时,将调用该槽 接收者的线程。插槽在接收器的线程中执行。
它的行为与触发信号的线程无关(不是所有连接类型的情况)。
您所遇到的是制作人 tcpSocket
,其生成速度比消费者 this
更快。如你所说onTCPDataArrived
需要花费很多时间。
您应修改onTCPDataArrived
,以便: