大家!

我在使用QUdpSocket和readyRead信号时遇到一个奇怪的问题,我可以说它不起作用,

我创建一个QUdpSocket并将其绑定(bind)到某个端口,将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会丢弃信号?

我检查了我的套接字状态,绑定(bind)后它没有改变。

提前致谢

最佳答案

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

没有时间进行测试,但是您对更改数据速率计时器的看法使我认为可能是这样。

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

关于c++ - QUdpSocket高速率消息读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38720049/

10-10 10:23