比如说“当某某数值改变是我要......,当某某集合增删单元时我要......,当用户在文本框输入时我要.......,当用鼠标移开某区域时我要........,当用户把窗体拖到 windows 桌面边缘时需要......,当网络中断后应该..............”等等等等无数的底层事件驱动概念。至于从业务逻辑出发的的事件驱动的描述就更多了。那么没有学过真正软件设计的人,他满脑子就是用轮询的“while 循环+线程+自阻塞”或者timer来模拟那些事件驱动开发技术,他画出的流程图、状态图、消息时序图都是同步轮询的而不是事件驱动的,所以他写出的代码也就不可能是最终的一个真正的性能尚可的正规产品需要的代码。
把机器人的状态数据作为事件源,
事件触发更新界面
如果数据解析和展示花费的时间超过了timer的interval,就会重入
而timer中的处理逻辑不允许重入,那就悲剧了
处理方法可以3楼说的,将数据接收和解析分离;
也可以将timer换成thread
实现“获取各轴角度”的时候,至少需要你懂的 INotifyPropertyChanged 模式,才能搞有效率的开发。否则只能纠结于胡乱轮询的频率问题没完没了。
创建一个后台线程:线程的过程
AxisDatas old;
void Porc()
{
AxisDatas a=ReadData(); //读取所有
if(IsEquals(old,a)==false) //比对是否变化(函数自己完成),没变化不通知
{
old=a;
MainWindow.BeginInoke(UpdatePorc ,a); //UpdateProc是一个前台的更新函数,参数就是a,BeginInvoke是转到前台运行这个函数
}
}UpdatePorc 需要内部的实现控制下更新频率,可以不每条更新到前台,加入1毫秒一次,能卡死你,可以间隔着来,控制在200毫秒一次就行
对如果用timer只获取数据的话 不卡 但是涉及到 仿真 需要 模型的运动 跟 实际机器人的动作 同步 这样就造成了界面的卡顿
不懂没有关系,你知道有设计模式问题以后加入正规开发团队时引起注意就行了。我们遇到过许多次,比如说某个很好的产品,突然某个新来的研究生自以为会编程,结果胡乱加入了一个50毫秒检测一次的 timer,结果系统软件就越来越卡。而假设这个时候整个团队的开发人员基本上都是那种只知道“各人自扫门前雪”的人,没有人曾经注意过学习好设计模式问题,那么他们也就不会及时汇报这颗老鼠屎坏了这一锅汤,那么这个软件系统就会持续一段时间都一直很卡,甚至可能造成用户、投资人不满,甚至造成“腾讯公司的一个做邮箱的团队的小产品反而把别的更专业的大团队的微信给淘汰了”的悲剧。疯狂轮询是个坑爹的设计模式。要学会基本的事件驱动设计思想,这才刚刚开始学程序设计。谢谢您的发言 我是否可以使用多线程 后台时时获取同时去除重复数据 然后跟新界面数据?