singleQt::QueuedConnection如何在单线程应用程序中工作

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

本文关键字:应用程序 工作 单线程 QueuedConnection singleQt      更新时间:2023-10-16

我正在做:

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,以便:

  • 要么它消耗大量。例如,如果生产者在写入每个字符后发出通知,消费者可以一次读取所有可用的字符
  • 要么它会丢弃一些数据
相关文章: