Задержка Qt EventLoop при подключении высокочастотного сигнала к слотам

Я действительно схожу с ума по этому поводу, и я надеюсь, что у кого-то есть ответ …
Я сталкиваюсь со странной проблемой QUdpSockets и соединение сигналов и слотов. Я получаю небольшие пакеты данных (64 байта) на 3 разных UdpSockets с 100 Гц без какой-либо обработки впоследствии. Сигнал<-> Слот-соединение для считывания швов данных для полноценной работы на разных ноутбуках, но не на том компьютере, на котором он должен работать в конце, который имеет гораздо большую вычислительную мощность, чем ноутбуки.

Я запускаю один и тот же код на каждой машине с одинаковыми настройками. Проблема в том, 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 64bit, Qt 5.11.2

BR
Майк

1

Решение

Очевидно, что на более медленных компьютерах всегда есть только одна датаграмма, ожидающая чтения. С более быстрым компьютером вы, возможно, получили более одного к тому времени, когда вы читаете в своем слоте. Вы должны всегда читать все ожидающие дейтаграммы, когда вы получаете readyRead сигнал. Ты можешь использовать QUdpSocket :: hasPendingDatagrams для этого.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]