0

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

我使用 11 个 dotnet 圆形仪表,每个仪表包含 2 个刻度和 2 个指针。在每个仪表的每个线程中,我制作了一个循环,缓慢更新针值,直到它达到我想要的值,没有这个循环,针突然跳到该值,我不会发生这种情况,所以当前值 +/- 0.003指针直到它到达该值。

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

我只想刷新针而不是整个仪表。

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

4

1 回答 1

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 工作完成。Send() 将阻塞后台线程,直到 UI 工作完成。

于 2013-04-17T22:02:11.437 回答