我有一个UDP数据包,在GPS定位的定时间隔内广播。它目前每50ms播出一次。我有一个事件处理程序,在每个新数据包上引发,然后我处理数据包并调用其他代码。广播相当一致,但也会有一些波动。不时因为数据包速度加快或我的代码被挂起,我开始有事件队列问题/增长因为我没有返回等待下一个事件被提升因为下一个数据包进入太快或者被调用的代码不完整。
所以,这提出了一个问题,这里使用的事件处理程序是最好的吗?我认为它们会引发一个后续问题,最好的办法是确保我为下一个数据包做好准备。
我有两个想法:
对于数据包进入速度过快的问题,我可能只是放弃它并等待下一个数据包。换句话说,如果每50ms对我有好处,我会将其设置为阈值。如果一个数据包在30ms之后进入,我知道它进入得太快而我放弃它并等待下一个数据包以便时间的波动不会影响我。这可能是一个很好的保护,以防万一有什么事情发生,并且数据包每1ms发送一次。
对于事件处理程序,处理程序可能只是侦听并接收数据包,然后启动任务或线程进行处理,以便事件处理程序可以立即返回并为下一个数据包做好准备?这是我被卡住的地方,因为我的想法告诉我你可以运行同步问题,后续线程比以前的线程更快地完成(我说线程但可能是任务或线程池)现在你们都不同步这可能是像GPS定位这样的问题。我不确定如何实现这样的事情并处理潜在的同步问题。
欢迎提供帮助和建议!
谢谢!
答案 0 :(得分:1)
这里的关键是让事件处理程序尽可能少地工作,这样就不会堆叠多个处理快速接收的数据包的事件处理程序。
基本上,您似乎有一个队列,其中有一个事件处理程序接收到队列的传入消息 - 但我怀疑您正在使用事件处理程序来处理该数据包。
更好的设计是仅使用事件处理程序将传入数据包添加到共享的Queue实例。然后,您可以拥有一个后台线程,将该项目从队列中弹出并处理它们。这意味着数据包进入的速度无关紧要。