single Qt::QueuedConnection 在单线程应用程序中如何工作?

singleHow does Qt::QueuedConnection work in a single thread application?

我在做:

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

但是插槽被调用的次数比应有的少很多。

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

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

问题:如果信号和槽在同一个线程中,当槽已经运行时,接收者仍然在排队传入信号?

Qt::QueuedConnection documentation规定

The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.

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

您遇到的是 生产者 tcpSocket,它的生产速度比 消费者 this.正如你所说onTCPDataArrived需要很多时间。

你应该修改 onTCPDataArrived 这样:

  • 要么吃大份。例如,如果生产者在写入每个字符后通知,消费者可以立即读取所有可用的字符。
  • 要么丢弃一些数据。

TCP/IP从不保证数据在接收端如何被分割成数据包。因此,您可能会发送 10 个字节 "all at once",并且允许接收端接收 10 个通知(每个字节一个)和 0 个通知之间的任何位置。为什么是零?因为此后不久您可能会再发送 10 个字节,并且所有 20 个字节都会有一个通知。这与 Qt 完全无关。

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