Qt EventLoop延迟,带有高频信号<->插槽连接

时间:2018-10-09 12:43:34

标签: c++ qt event-handling udp udpclient

我为此感到非常疯狂,希望有人能给出答案... 我确实遇到QUdpSockets以及信号和插槽连接的奇怪问题。我正在以3个不同的UdpSockets接收100Hz的小数据包(64字节),此后未进行任何处理。用于读取数据接缝的Signal <-> Slot Connection可以在不同的笔记本电脑上完全正常工作,但是在最终运行的PC上却无法正常工作,这比笔记本电脑具有更大的处理能力。

我在具有相同设置的每台计算机上运行相同的代码。问题是recvEvents在计算机上排队等待并延迟了几秒钟,但在笔记本电脑上却延迟了几秒钟。起初我以为这是网络问题,但是我已经尝试过不同的网卡/交换机等。还有其他一些事情。唯一有帮助的是将接收信号从信号<->插槽更改为带有std::thread的另一个线程,因此,它肯定必须对readyRead信号的连接进行某些处理。某些代码:


connect(&udpSocket, &QUdpSocket::readyRead, this, &DataController::handleData);// Called with 100Hz
void handleData(){     //This function call is beeing delayed/queued....
    udpSocket.readDatagram(&data,datasize);    
}

我的问题:

  1. 是否可以处理事件/秒的限制?
  2. 您对我可以在哪里查找错误或如何找到建议有什么建议吗? 加快QEventLoop

我正在跑步: Win10 Pro,VS 2017 64位,Qt 5.11.2

BR 迈克

1 个答案:

答案 0 :(得分:1)

很显然,对于速度较慢的计算机,您总是只有一个数据报在等待读取。使用速度更快的计算机,您在阅读插槽时可能已经收到了不止一本。收到readyRead信号时,应始终读取所有未决的数据报。您可以为此使用QUdpSocket::hasPendingDatagrams

void handleData(){
    while (udpSocket.hasPendingDatagrams()) {
        // clear data buffer
        udpSocket.readDatagram(&data,datasize);
        // process received datagram before reading next...
    }
}