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