单个线程应用程序中Qt :: QueuedConnection是如何工作的?

时间:2015-02-26 17:37:29

标签: c++ qt signals-slots queued-connection

我正在做:

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

但是调用插槽的时间远远少于应有的时间。

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

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

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

2 个答案:

答案 0 :(得分:2)

使用TCP / IP,从不可以保证数据如何在接收端被斩波为数据包。因此,您可以“一次性”发送10个字节,并允许接收端接收10个通知(每个字节一个)和0个通知之间的任何地方。为什么零?因为此后很快你可能会发送另外10个字节,并且所有20个字节都会有一个通知。这与Qt完全无关。

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

答案 1 :(得分:0)

Qt::QueuedConnection documentation规定

  

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

它的行为与触发信号的线程无关(不是所有连接类型的情况)。

您所遇到的是制作人 tcpSocket,其生成速度比消费者 this更快。如你所说onTCPDataArrived需要花费很多时间。

您应修改onTCPDataArrived,以便:

  • 要么消耗很大一部分。例如,如果生产者在写完每个字符后通知,则消费者可以一次性读取所有可用的字符。
  • 要么丢弃一些数据。