具有高频信号 <-> 槽连接的 Qt EventLoop 延迟

Qt EventLoop delay with high frequency signal<->slot connections

我真的为此发疯了,我希望有人能给出答案... QUdpSockets 和信号槽连接确实遇到了一个奇怪的问题。我在 3 个不同的 UdpSockets 以 100Hz 接收小数据包(64 字节),之后没有任何处理。用于读取数据接缝的 Signal<-> Slot Connection 可以在不同的笔记本电脑上完全正常工作,但在 pc 上它最终应该 运行 不行,它比笔记本电脑具有更多的处理能力。

我运行在具有相同设置的每台机器上使用相同的代码。问题是,recvEvents 在 pc 上以某种方式排队并延迟了几秒钟,但在笔记本电脑上却没有。起初我以为这是网络问题,但我已经尝试了不同的网络 cards/switches 等……以及其他一些事情。唯一有帮助的是将接收代码从信号 <-> 插槽更改为具有 std::thread 的另一个线程,因此它肯定必须对来自 readyRead signal.Some 代码的连接做一些事情:


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

我的问题:

  1. 有没有可以处理的Events/seconds的限制?
  2. 你有什么建议我可以在哪里查找错误或如何查找错误 加快 QEventLoop?

我是 运行: Win10 专业版,VS 2017 64 位,Qt 5.11.2

BR 麦克

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

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