在Windows CE 6.0多线程程序中快速更新Windows窗体.. NET 3.5紧凑框架)

本文关键字:Windows NET 窗体 框架 更新 CE 多线程 程序 | 更新日期: 2023-09-27 18:09:06

我是在基于arm的32位处理器上使用c#和。net 3.5 Compact Framework在Windows CE 6.0上编程的新手。我应该创建一个用户界面,显示来自多线程程序中不同线程的信息(想想更新状态板或游戏循环)。使用我在更典型的Windows桌面应用程序中使用过的技巧,我在自己的线程中启动Windows窗体,并在Paint事件处理程序中更新外观。

我有一个API,其他线程可以调用(它是线程安全的,据我所知-锁共享数据项等),并调用更新数据结构,然后触发Invalidate()在我的Windows窗体上。我的期望是,某个时候(很快,希望)我的表单被告知重新绘制,它更新屏幕与最新的数据提供。

只是我没有得到我期望的那么快的刷新率。我甚至添加了一个计时器,每秒触发Invalidate() 30次,并且我没有得到更频繁的更新,即使在简化的设置中也是如此。在一个更恶毒的设置中,我启动一个线程,基本上是做while (true) {},然后我的Paint事件永远不会被调用(这并不奇怪,真的,但仍然…)。所以我不确定我是否不了解我的程序正在运行的环境(非常可能),或者是否有一些其他的事情我需要在Windows CE中考虑,我目前不知道。我花了很多时间在谷歌上,阅读了很多SO的回复和各种博客等等。我的显示刷新速度仍然比我需要的慢。

我知道这有点模糊。我想了解的是,如果有一些技巧,我需要了解关于Windows CE 6.0,它的多线程和Windows窗体等的实现,看看是否有办法提高我的窗体绘画的刷新率(理想情况下,确保它至少每秒被调用一次,例如)。

在Windows CE 6.0多线程程序中快速更新Windows窗体.. NET 3.5紧凑框架)

我不确定这是否有帮助,但考虑一下:

不要在没有休眠的情况下运行线程。DO/While(TRUE)是坏的。Windows CE是多线程的,但是给一个线程的时间片取决于所有线程的合作,让操作系统有机会让位给另一个线程。

不要对整个表单使用无效或刷新。如果你要显示来自不同线程的信息列表,只允许线程更新它的GUI部分。

你可以使用SendMessage来更新GUI而不是PostMessage(与使用事件/委托相反)。SendMessage将阻塞,直到msg被处理,所以只能在后台线程中使用它。但是SendMessage将确保在GUI线程上最快的更新(如果用于屏幕的一部分)。

你甚至可以使用消息队列来解耦后台线程和GUI。因此,将线程的所有更新发布到队列中,并在GUI上查看消息以对GUI进行更改。同样,不要运行没有Sleep或WaitObject的后台线程。

您可以使用invalidate/refresh来更新GUI,但只能在单个控件上使用它。例如:你有许多显示线程值的标签,当一个线程值要更新时,只使分配给线程值的标签无效/刷新,而不是整个表单。

你可以使用事件同步GUI更新和线程,所以一个线程被阻塞直到GUI触发事件来解除阻塞,例如当GUI完成处理线程的更新消息时。

请注意,Windows CE不是实时操作系统。它使用合作多任务。一个线程可以消耗几乎所有的处理器时间。

可能做一个win32 API应用程序会提高速度,因为紧凑框架代码(IL, GarbageCollection等)比本机代码慢。