如何在更新线程中的针值(C#winforms)时刷新圆形量规?

时间:2013-04-17 18:25:27

标签: c# .net multithreading winforms

我用来创建一个从串口读取数据并在圆形量规上显示这些数据的项目。我创建了一个用于接收数据的线程,一个用于发送数据的线程和一个用于每个仪表的线程来更新针值。

我使用11个dotnet圆形仪表,每个仪表包含2个刻度,2个指针。在每个仪表的每个螺纹中,我做了一个循环,慢慢更新针的值,直到达到我想要的值,没有这个循环,针突然跳到该值,我不这样发生,所以当前值+/- 0.003指针直到达到值。

我的问题是,当我单独运行每个仪表时,它工作正常,但当所有仪表同时工作时,表格冻结,然后突然所有指针跳转到如何处理此问题的值? (我不知道为什么会发生这种情况,我认为每个仪表都在一个单独的线程中工作,为什么表格会冻结?)

我想要刷针而不是整个规格。

(每个仪表代表从A到H标记的电机) My code: http://ideone.com/GntXoE

1 个答案:

答案 0 :(得分:1)

Winforms不支持从后台线程更新UI控件。每当您想要从后台线程更新UI控件时,您需要将消息从后台线程传递到UI线程,并在UI线程上执行控件的更新。

执行此操作的一种方法是使用System.Threading.SynchronizationContext。在主UI线程上运行时将同步上下文捕获到变量中,然后将该上下文传递给每个后台线程。当后台线程需要更新UI控件时,调用context.Post并传入将在UI线程上执行的回调。

这样的事情:

context.Post(() => { control.Percent += 10; });

这将使UI在UI线程中保持工作,UI线程消息循环将处理重新绘制表单和控件的状态。使用Post()而不是Send()将使您的后台线程立即返回其任务,而无需等待UI工作完成。发送()将阻止后台线程,直到UI工作完成。