Я действительно схожу с ума по этому поводу, и я надеюсь, что у кого-то есть ответ …
Я сталкиваюсь со странной проблемой 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);
}
Мой вопрос:
QEventLoop
?Я бегу:
Win10 Pro, VS 2017 64bit, 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...
}
}
Других решений пока нет …