0

我正在做:

connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(onTCPDataArrived()), Qt::QueuedConnection);

但是插槽被调用的次数远远少于它应有的次数。

似乎它错过了很多信号,可能是因为插槽需要很长时间(确实如此)。

我在 tcp 写入之间的传输端添加了 2ms 的延迟,它变得更好:插槽被调用得更多。

问题:如果信号和槽在同一个线程中,当槽已经运行时,接收器是否还在排队输入信号?

4

2 回答 2

2

使用 TCP/IP 时,永远无法保证数据在接收端是如何被分割成数据包的。因此,您可以“一次”发送 10 个字节,并且允许接收端接收 10 个通知(每个字节一个)和 0 个通知之间的任意位置。为什么是零?因为您可能很快就可以再发送 10 个字节,并且所有 20 个字节都会有一个通知。这与 Qt 完全无关。

因此,当readyRead()触发时,您必须读取所有可供读取的数据。您将不会再收到有关此数据的通知。

于 2015-02-26T20:09:38.917 回答
0

Qt::QueuedConnection 文档规定

当控制返回到接收者线程的事件循环时调用该槽。插槽在接收者的线程中执行。

它的行为独立于触发信号的线程(并非所有连接类型的情况)。

您正在经历的是生产者 tcpSocket的生产速度比消费者 this快。正如你所说onTCPDataArrived,需要很多时间。

您应该onTCPDataArrived这样修改:

  • 要么它消耗很大一部分。例如,如果生产者在写入每个字符后通知,则消费者可以立即读取所有可用字符。
  • 要么它丢弃一些数据。
于 2015-02-26T17:53:39.737 回答