搜索
bottom↓
回复: 9

C#窗体中十几个label要在串口事件中更新?如何快捷安全实现?

[复制链接]

出0入4汤圆

发表于 2022-8-22 16:37:53 | 显示全部楼层 |阅读模式
C#窗体中十几个label要在串口事件中更新?如何快捷安全实现?  一个控件一个控件的委托?  或者还是有更好的方法,有知道的大侠吗?

出0入16汤圆

发表于 2022-8-22 16:51:00 | 显示全部楼层
一次指令更新几十个lable,还是多条指令更新几十个lable,一次的话就this.invoke((eventhandler)delegate{ lab1=*;lab2=*;lab3=*; }) 或者推送数据到一个单独的队列线程,在线程里批量委托处理

出20入44汤圆

发表于 2022-8-22 17:00:17 | 显示全部楼层
串口事件只更新标记,刷新gui在另外一个线程独立执行就行。
我用这种方式的串口收数据,500hz的帧率,跑半天也不会丢帧。对我来说做测试够用了。

出0入0汤圆

发表于 2022-8-22 20:08:23 | 显示全部楼层
Invoke(new Action(() =>  {  设置窗体相关控件(例如文本框等等)  }))

出0入89汤圆

发表于 2022-8-22 20:27:02 | 显示全部楼层
反正在delphi里串口在线程中通信,线程内部的事件可以用Sync更新form,而且必须用sync更新,否则会有内存访问问题

出0入4汤圆

 楼主| 发表于 2022-8-22 21:02:17 | 显示全部楼层
天下乌鸦一般黑 发表于 2022-8-22 17:00
串口事件只更新标记,刷新gui在另外一个线程独立执行就行。
我用这种方式的串口收数据,500hz的帧率,跑半 ...
(引用自3楼)

你这方法要搞个全局变量的标志才行吧。。。感觉不正统,这么搞所有的变量都要备份一个 ,留在另外一个线程用于更新。

出0入4汤圆

 楼主| 发表于 2022-8-22 21:02:49 | 显示全部楼层
gallop020142 发表于 2022-8-22 20:08
Invoke(new Action(() =>  {  设置窗体相关控件(例如文本框等等)  }))
(引用自4楼)

有没有代码示例呀?

出0入16汤圆

发表于 2022-8-23 08:43:17 | 显示全部楼层
fbwcpu 发表于 2022-8-22 21:02
有没有代码示例呀?
(引用自7楼)

C#就是我上面的代码 control.invoke((eventhandler)delegate{  ...  })这个是同步委托的,begininvoke是异步委托,速度不快频率不高串口收完数据直接调用就行了,数据量频繁的开个线程,串口收到数据把数据推送到队列,然后在那个线程里处理队列数据更新UI

出0入0汤圆

发表于 2022-8-23 10:08:54 | 显示全部楼层
fbwcpu 发表于 2022-8-22 21:02
有没有代码示例呀?
(引用自7楼)

Invoke(new Action(() =>  {  设置窗体相关控件(例如文本框等等)  }))

举个例子:
在一个自己新开的线程里面,想要修改一个richtextbox,
如果直接 richtextbox.AppendText("blabla"); 就会报错;
需要换成:
Invoke(new Action(() =>  {  richtextbox.AppendText("blabla");  }))

出40入244汤圆

发表于 2022-8-23 10:14:12 | 显示全部楼层
label更新频率不高,我以前都是跨线程直接调用,都是自用工具而已
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 -- 东莞阿莫电子网站 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2023-1-28 18:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表