QUdpSocket高速率信息读取

时间:2016-08-02 12:09:39

标签: c++ qt qeventloop qudpsocket

大家!

我在使用QUdpSocket和readyRead信号时遇到一个奇怪的问题,我可以说它没有像我想的那样工作,

我创建一个QUdpSocket并将其绑定到某个端口,将readyRead信号连接到我的插槽,然后我读取所有挂起的数据报,如下所示

if(!udp_listener)
{
      udp_listener = new QUdpSocket(this);
      connect(udp_listener, SiGNAL(readyRead()), this, SLOT(readBuffers(), Qt::QueuedConnection);
      // the rate of receiving data is 10 msec if i dont put Qt::QueuedConnection, it didn't receive any more signal after first received. why ???
      // change the rate of data to 1 sec and this code work well without Qt::QueuedConnection !!! 
}

udp_lister.bind(Any, 5555);

和我的readBuffers代码

void readBuffers() {
    QString buffer;
    while(udp_listener->hasPendingDatagrams()) {
           QByteArray received;
           received.resize(udp_listener->pendingDatagramSize());
           udp_listener->readDatagram(received, received.size(), 0,0);
           buffer.append(received);
           // Do some job in 1 msec on buffer and take data from buffer
           if(/* some works done */) buffer.clear(); // almost every time my buffer got cleared 
    }
}

我认为使用Qt :: QueuedConnection解决了我的问题,但今天我在项目中添加了另一个小部件并每100毫秒更新一次。我不知道怎么回事,但我的插槽在2秒后没有发出信号。

如果我更改定时器间隔或将数据速率发送到1秒,一切都很好。

我的所有课程和小部件都存在于主程序的主题中,我不会使用其他主题,但似乎我应该这样做!

那么为什么信号会被Qt eventloop掉线?

我检查我的套接字状态,并且在绑定后它没有改变。

提前致谢

1 个答案:

答案 0 :(得分:1)


Qt :: QueuedConnection告诉信号被添加到队列中,而不是在继续之前等待它被处理。
如果您对接收到的数据所做的工作需要一些时间,那么发送速率可能比读取速率高得多,导致信号队列很大,因此qt系统会阻塞信号?

没有时间对其进行测试,但您对更改数据速率计时器的看法让我觉得它可能就是这样。

也许尝试衡量处理数据所需的时间,并尝试一些不同的发送计时器长度来测试您是否可以验证这个想法。