C++ QUdpSocket高速消息读取
大家好 我在使用QUdpSocket和readyRead信号时遇到了一个奇怪的问题,我可以说它没有像我想的那样工作 我创建一个QUdpSocket并将其绑定到某个端口,将readyRead信号连接到我的插槽,然后读取所有挂起的数据报,如下所示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
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中。