fbwcpu 发表于 2022-8-22 16:37:53

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

C#窗体中十几个label要在串口事件中更新?如何快捷安全实现?一个控件一个控件的委托?或者还是有更好的方法,有知道的大侠吗?

初音之恋 发表于 2022-8-22 16:51:00

一次指令更新几十个lable,还是多条指令更新几十个lable,一次的话就this.invoke((eventhandler)delegate{ lab1=*;lab2=*;lab3=*; }) 或者推送数据到一个单独的队列线程,在线程里批量委托处理

天下乌鸦一般黑 发表于 2022-8-22 17:00:17

串口事件只更新标记,刷新gui在另外一个线程独立执行就行。
我用这种方式的串口收数据,500hz的帧率,跑半天也不会丢帧。对我来说做测试够用了。

gallop020142 发表于 2022-8-22 20:08:23

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

szjqt 发表于 2022-8-22 20:27:02

反正在delphi里串口在线程中通信,线程内部的事件可以用Sync更新form,而且必须用sync更新,否则会有内存访问问题

fbwcpu 发表于 2022-8-22 21:02:17

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

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

fbwcpu 发表于 2022-8-22 21:02:49

gallop020142 发表于 2022-8-22 20:08
Invoke(new Action(() =>{设置窗体相关控件(例如文本框等等)}))
(引用自4楼)

有没有代码示例呀?

初音之恋 发表于 2022-8-23 08:43:17

fbwcpu 发表于 2022-8-22 21:02
有没有代码示例呀?
(引用自7楼)

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

gallop020142 发表于 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");}))

智涅 发表于 2022-8-23 10:14:12

label更新频率不高,我以前都是跨线程直接调用,都是自用工具而已{:titter:}
页: [1]
查看完整版本: C#窗体中十几个label要在串口事件中更新?如何快捷安全实现?