繁体   English   中英

在Windows CE 6.0多线程程序(.NET 3.5 Compact Framework)中快速更新Windows窗体

[英]Updating Windows form rapidly in Windows CE 6.0 multi-threaded program (.NET 3.5 Compact Framework)

我是第一次使用C#和.NET 3.5 Compact Framework在基于ARM的32位处理器上的Windows CE 6.0中进行编程。 我应该创建一个用户界面,以显示来自多线程程序中不同线程的信息(例如,对状态板或游戏循环的更新)。 使用在更典型的Windows桌面应用程序上所做的技巧,我在自己的线程上启动Windows窗体,并更新Paint事件处理程序中的外观。

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

只有我的刷新率没有我期望的那么快。 我什至设置了一个计时器,该计时器每秒触发Invalidate()30次,即使在简化的设置中,也没有得到更频繁的更新。 在更恶性的设置中,我启动了一个基本上在while (true) {}的线程,然后从未调用我的Paint事件(在那里,确实,但仍然如此,这并不奇怪)。 因此,我不确定我是否不了解我的程序所运行的环境(非常可能),或者是否需要在Windows CE中考虑一些我目前不了解的其他事情。 我已经在Google上度过了很多时间,阅读了很多SO响应和各种博客等。我的显示刷新仍然比我需要的慢。

我意识到这有点含糊。 我想了解的是,关于Windows CE 6.0我是否需要了解一些技巧,它是多线程和Windows窗体的实现等,以查看是否有方法可以提高窗体的刷新率绘画(例如,最好至少每秒调用一次)。

我不确定这是否有帮助,但请考虑以下问题:

不要在没有睡眠的情况下运行线程。 DO / While(TRUE)不好。 Windows CE是多线程的,但是分配给线程的时间片取决于所有线程的协作,从而使OS有机会屈服于另一个线程。

请勿在整个表单上使用无效或刷新。 如果您有要从不同线程显示的信息列表,请仅让线程更新其GUI部分。

您可以使用SendMessage而不是PostMessage来更新GUI(与使用事件/代理相反)。 SendMessage将一直阻塞,直到处理完味精,因此只能从后台线程使用它。 但是SendMessage将确保GUI线程上的最快更新(如果用于屏幕的一部分)。

您甚至可以使用消息队列解耦后台线程和GUI。 因此,将线程的所有更新发布到队列中,然后在GUI上浏览该消息以对GUI进行更改。 同样,不要在没有Sleep或WaitObject的情况下运行后台线程。

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

您可以使用事件同步GUI更新和线程,因此线程将被阻塞,直到GUI触发要解除阻止的事件为止,例如,当GUI完成处理线程的更新消息时。

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

可能执行win32 API应用程序会提高速度,因为Compact Framework代码(IL,GarbageCollection等)比本机代码慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM