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

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

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

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

BaseCommand类:不同指令处理类的基类,包含一些各条指令都会用到的功能和记录该指令绑定的客户端
...全文
219 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Crh 2016-08-05
  • 打赏
  • 举报
回复
引用 5 楼 u012441819 的回复:
引用 2 楼 qqCrh 的回复:
建议增加中断机制,当客户端收到某个特定指令的时候中断发送(例如:Cmd_Get)。这样的话就可以安心处理完要处理的事情。待处理完事情以后再发送完成指令(例如:Cmd_Ok)。如果处理异常可以在加入重发指令(例如:Cmd_ReSend)。这样就不会出现你说的当一个指令未完成有来下一个指令了。
其实是有中断机制的,只不过不清楚为啥产线上的电脑那么卡,偶尔会出现还没来得及发送cmdget,那边就已经在发送第二条指令了,这时候就完蛋了。上边哪位朋友说的不错,加个字典应该就可以了。
好吧。这电脑我无语了。
巴士上的邂逅 2016-08-03
  • 打赏
  • 举报
回复
通讯逻辑有点问题,下位机应该等上位机有回应再发
Crh 2016-08-03
  • 打赏
  • 举报
回复
建议增加中断机制,当客户端收到某个特定指令的时候中断发送(例如:Cmd_Get)。这样的话就可以安心处理完要处理的事情。待处理完事情以后再发送完成指令(例如:Cmd_Ok)。如果处理异常可以在加入重发指令(例如:Cmd_ReSend)。这样就不会出现你说的当一个指令未完成有来下一个指令了。
巴士上的邂逅 2016-08-03
  • 打赏
  • 举报
回复
建一个全局变量保存recvMsg或者cmd,响应一条指令时判断是否与这个变量相同,相同就不处理,不相同就处理,变量赋为空
星悬_月 2016-08-03
  • 打赏
  • 举报
回复
引用 3 楼 yuankaiwsl 的回复:
通讯逻辑有点问题,下位机应该等上位机有回应再发
是等回应的,只不过等待时间未1秒,收不到回应就重发。可能电脑配置较低吧,偶尔会出现1s内不能及时应答的情况。
星悬_月 2016-08-03
  • 打赏
  • 举报
回复
引用 2 楼 qqCrh 的回复:
建议增加中断机制,当客户端收到某个特定指令的时候中断发送(例如:Cmd_Get)。这样的话就可以安心处理完要处理的事情。待处理完事情以后再发送完成指令(例如:Cmd_Ok)。如果处理异常可以在加入重发指令(例如:Cmd_ReSend)。这样就不会出现你说的当一个指令未完成有来下一个指令了。
其实是有中断机制的,只不过不清楚为啥产线上的电脑那么卡,偶尔会出现还没来得及发送cmdget,那边就已经在发送第二条指令了,这时候就完蛋了。上边哪位朋友说的不错,加个字典应该就可以了。
星悬_月 2016-08-03
  • 打赏
  • 举报
回复
引用 1 楼 yuankaiwsl 的回复:
建一个全局变量保存recvMsg或者cmd,响应一条指令时判断是否与这个变量相同,相同就不处理,不相同就处理,变量赋为空
好像有点道理,貌似建个字典就行,我试试。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧