Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QUdpSocket高速消息读取_C++_Qt_Qeventloop_Qudpsocket - Fatal编程技术网

C++ QUdpSocket高速消息读取

C++ QUdpSocket高速消息读取,c++,qt,qeventloop,qudpsocket,C++,Qt,Qeventloop,Qudpsocket,大家好 我在使用QUdpSocket和readyRead信号时遇到了一个奇怪的问题,我可以说它没有像我想的那样工作 我创建一个QUdpSocket并将其绑定到某个端口,将readyRead信号连接到我的插槽,然后读取所有挂起的数据报,如下所示 if(!udp_listener) { udp_listener = new QUdpSocket(this); connect(udp_listener, SiGNAL(readyRead()), this, SLOT(readB

大家好

我在使用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会丢弃信号呢

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

提前感谢


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

没有时间测试它,但您关于更改数据速率计时器的说法让我觉得可能是这样的。


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

可能您的程序在(udp_listener->hasPendingDatagrams())时卡在
loop?不,我的Gui是对发现的所有类型的信号的响应,这些信号似乎都是相关的。@thuga实际上我是在Windows 7平台上的Qt 5.6中编写了这段代码的,但我认为是的,它与这个错误有关。您认为什么是更好的实现?在答案中给出一些建议,这样我就把你的答案标记为正确答案。感谢搜索我在Windows7上用Qt5.5.1测试了这个,无论我让它发送数据报的速度有多快,它都工作得很好。不过,我在同一台机器上运行了发送器和侦听器,不确定这是否重要。如何找到当前的信号队列情况?我不明白为什么会发生这种情况,所有readBuffers函数都在运行。6 msecI对我的Qt版本是错误的!是Qt5.5,我将其更新为5.7,没有QueueConneciton,一切都很好;:)@丹尼斯,好吧,那你就去吧。bug报告说它是在5.5.1中修复的,而不是在5.5中。