C++ 高频信号Qt事件环路延迟<-&燃气轮机;插槽连接
我真的为此发疯了,我希望有人能给出答案。。。 我确实在C++ 高频信号Qt事件环路延迟<-&燃气轮机;插槽连接,c++,qt,event-handling,udp,udpclient,C++,Qt,Event Handling,Udp,Udpclient,我真的为此发疯了,我希望有人能给出答案。。。 我确实在QUdpSockets以及信号和插槽连接方面遇到了一个奇怪的问题。我正在以3个不同的UdpSockets接收100Hz的小数据包(64字节),之后没有任何处理。用于读取数据接缝的信号插槽连接可以在不同的笔记本电脑上完全正常工作,但最终不会在pc上运行,这比笔记本电脑具有更大的处理能力 我用相同的设置在每台机器上运行相同的代码。问题是,recvEvents不知何故在pc上排队并延迟了几秒钟,但在笔记本电脑上却没有。起初我认为这是一个网络问题,但
QUdpSockets
以及信号和插槽连接方面遇到了一个奇怪的问题。我正在以3个不同的UdpSockets
接收100Hz的小数据包(64字节),之后没有任何处理。用于读取数据接缝的信号插槽连接可以在不同的笔记本电脑上完全正常工作,但最终不会在pc上运行,这比笔记本电脑具有更大的处理能力
我用相同的设置在每台机器上运行相同的代码。问题是,recvEvents
不知何故在pc上排队并延迟了几秒钟,但在笔记本电脑上却没有。起初我认为这是一个网络问题,但我已经尝试了不同的网卡/交换机等。。还有其他一些事情。唯一有帮助的是使用std::thread
将接收代码从signalslots更改为另一个线程,因此它肯定需要处理来自readyRead
信号的连接。一些代码:
我的问题:
迈克显然,对于速度较慢的计算机,总是只有一个数据报等待读取。使用更快的计算机,当您在插槽中阅读时,您可能已经收到多个。当您收到
readyRead
信号时,应始终读取所有挂起的数据报。你可以用它
void handleData(){
while (udpSocket.hasPendingDatagrams()) {
// clear data buffer
udpSocket.readDatagram(&data,datasize);
// process received datagram before reading next...
}
}
一切都没有耽搁。你只读了一个数据报:你应该读更多。嗨!谢谢你的回答!你是对的,我没有在代码的这一部分包含对挂起数据报的检查,这可能是延迟的原因,我明天会更新代码,希望这会导致延迟!但对我来说,你的回答是反直觉的。我不明白为什么较慢的计算机只有一个数据报等待读取,由于数据堆积在套接字中,这不应该发生在速度更快的机器上,因为它更频繁地检查插槽?我认为原因是,只有在您读取了上一次readyRead时可用的所有数据报后,您才能再次获得readyRead信号。所以更快的电脑在等着你们阅读,你们只是幸运的是速度较慢的电脑保持同步
void handleData(){
while (udpSocket.hasPendingDatagrams()) {
// clear data buffer
udpSocket.readDatagram(&data,datasize);
// process received datagram before reading next...
}
}