每个客户端的指令单独响应,但是每条指令在执行完之前只响应一次


小弟写了个服务器程序,每当一个客户端(单片机)接入就新建一个线程,并实例化一个client类与客户端进行通讯。客户端会发3条指令,我把这三条指令封装成了单独的指令处理类,这样每个client实例收到指令时就会new一个指令处理类。但现在我遇到的问题是,每个指令处理类的处理速度并没有我想象中那么快,一条指令还没处理完毕,接着单片机又会发来一条同样的指令,这样就造成我又得new一个新的指令处理类来处理相同的指令,这样就会造成逻辑混乱。我想实现的功能是,每个指令处理实例在消亡前,client实例不再响应相通的指令。
感觉有点像单例模式,但是用单例的话就是全局只有一个指令处理对象了,不是我希望的每个通讯只有一个指令处理对象。

下面附上部分代码,望大神们为我指点一下!
client类:根据不同的指令用工厂创建不同的指令处理对象

ReTest类:ReTest指令处理类,继承子BaseCommand,实现了ExecuteCommand接口

BaseCommand类:不同指令处理类的基类,包含一些各条指令都会用到的功能和记录该指令绑定的客户端

7 个解决方案

#1


建一个全局变量保存recvMsg或者cmd,响应一条指令时判断是否与这个变量相同,相同就不处理,不相同就处理,变量赋为空

#2


建议增加中断机制,当客户端收到某个特定指令的时候中断发送(例如:Cmd_Get)。这样的话就可以安心处理完要处理的事情。待处理完事情以后再发送完成指令(例如:Cmd_Ok)。如果处理异常可以在加入重发指令(例如:Cmd_ReSend)。这样就不会出现你说的当一个指令未完成有来下一个指令了。

#3


通讯逻辑有点问题,下位机应该等上位机有回应再发

#4


引用 1 楼 yuankaiwsl 的回复:
建一个全局变量保存recvMsg或者cmd,响应一条指令时判断是否与这个变量相同,相同就不处理,不相同就处理,变量赋为空
好像有点道理,貌似建个字典就行,我试试。

#5


引用 2 楼 qqCrh 的回复:
建议增加中断机制,当客户端收到某个特定指令的时候中断发送(例如:Cmd_Get)。这样的话就可以安心处理完要处理的事情。待处理完事情以后再发送完成指令(例如:Cmd_Ok)。如果处理异常可以在加入重发指令(例如:Cmd_ReSend)。这样就不会出现你说的当一个指令未完成有来下一个指令了。
其实是有中断机制的,只不过不清楚为啥产线上的电脑那么卡,偶尔会出现还没来得及发送cmdget,那边就已经在发送第二条指令了,这时候就完蛋了。上边哪位朋友说的不错,加个字典应该就可以了。

#6


引用 3 楼 yuankaiwsl 的回复:
通讯逻辑有点问题,下位机应该等上位机有回应再发
是等回应的,只不过等待时间未1秒,收不到回应就重发。可能电脑配置较低吧,偶尔会出现1s内不能及时应答的情况。

#7


引用 5 楼 u012441819 的回复:
Quote: 引用 2 楼 qqCrh 的回复:

建议增加中断机制,当客户端收到某个特定指令的时候中断发送(例如:Cmd_Get)。这样的话就可以安心处理完要处理的事情。待处理完事情以后再发送完成指令(例如:Cmd_Ok)。如果处理异常可以在加入重发指令(例如:Cmd_ReSend)。这样就不会出现你说的当一个指令未完成有来下一个指令了。
其实是有中断机制的,只不过不清楚为啥产线上的电脑那么卡,偶尔会出现还没来得及发送cmdget,那边就已经在发送第二条指令了,这时候就完蛋了。上边哪位朋友说的不错,加个字典应该就可以了。
好吧。这电脑我无语了。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号