我正在做:
connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(onTCPDataArrived()), Qt::QueuedConnection);
但是插槽被调用的次数比它应该调用的次数要少得多。
它似乎错过了很多信号,可能是因为插槽需要很长时间(确实如此)。
我在tcp写入之间的传输端增加了2ms的延迟,这变得更好了:插槽被调用得更多。
问题:如果信号和插槽在同一个线程中,那么当插槽已经运行时,接收器是否仍在排队输入信号?
使用TCP/IP,对于如何在接收端将数据分割成数据包,有从未任何保证。因此,您可以"一次发送10个字节",并且接收端可以接收10个通知(每个字节一个)到0个通知之间的任何通知。为什么为零?因为您可能很快会再发送10个字节,并且会有一个通知用于所有20个字节。这与Qt完全无关。
因此,当readyRead()
触发时,您必须读取所有可供读取的数据。您将不会再次收到有关此数据的通知。
Qt::QueuedConnection文档规定
当控件返回到接收器的线程。插槽在接收器的线程中执行。
它的行为与触发信号的线程无关(并非所有连接类型都是这样)。
您所经历的是一个生产者tcpSocket
,它的生产速度快于消费者this
。正如你所说,onTCPDataArrived
需要很多时间。
您应该修改onTCPDataArrived
,以便:
- 要么它消耗大量。例如,如果生产者在写入每个字符后发出通知,消费者可以一次读取所有可用的字符
- 要么它会丢弃一些数据