我为此感到非常疯狂,希望有人能给出答案...
我确实遇到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);
}
我的问题:
QEventLoop
?我正在跑步: Win10 Pro,VS 2017 64位,Qt 5.11.2
BR 迈克
答案 0 :(得分:1)
很显然,对于速度较慢的计算机,您总是只有一个数据报在等待读取。使用速度更快的计算机,您在阅读插槽时可能已经收到了不止一本。收到readyRead
信号时,应始终读取所有未决的数据报。您可以为此使用QUdpSocket::hasPendingDatagrams。
void handleData(){
while (udpSocket.hasPendingDatagrams()) {
// clear data buffer
udpSocket.readDatagram(&data,datasize);
// process received datagram before reading next...
}
}