【问题标题】:Updating Windows form rapidly in Windows CE 6.0 multi-threaded program (.NET 3.5 Compact Framework)在 Windows CE 6.0 多线程程序(.NET 3.5 Compact Framework)中快速更新 Windows 窗体
【发布时间】:2015-08-21 21:34:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net multithreading compact-framework windows-ce


    【解决方案1】:

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

    不要在没有睡眠的情况下运行线程。 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 不是实时操作系统。它使用协作式多任务处理。单个线程几乎可以消耗所有处理器时间。

    由于 Compact Framework 代码(IL、GarbageCollection 等)比本机代码慢,因此可能做一个 win32 API 应用程序会提高速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      相关资源
      最近更新 更多