我不熟悉在基于ARM的32位处理器上使用C#和.NET 3.5Compact Framework进行Windows CE6.0编程。我应该创建一个用户界面,在一个大量多线程的程序中显示来自不同线程的信息(想一想对状态板或游戏循环的更新)。使用我在更典型的Windows桌面应用程序上所做的技巧,我在Windows窗体自己的线程上启动Windows窗体,并在Paint事件处理程序中更新外观。
我有一个其他线程可以调用的API (据我所知,它是线程安全的--共享数据项上的锁,等等),更新数据结构的调用会在我的Windows表单上触发一个Invalidate()。我的期望是,在某个时候(希望很快),我的窗体会被告知重新绘制,它会用提供的最新数据更新屏幕。
只是我的刷新率并不像我预期的那样快。我甚至设置了一个计时器,该计时器每秒触发Invalidate() 30次,即使在简化的设置中,我也没有得到更频繁的更新。在一种更恶意的设置中,我启动了一个基本上执行while (true) {}
的线程,然后我的Paint事件永远不会被调用(这并不奇怪,真的,但仍然...)。因此,我不确定是不是对运行程序的环境不了解(很有可能),还是在Windows CE中有其他一些我目前不知道的事情需要说明。我花了很多时间在谷歌上,阅读了大量的SO回复和各种博客,等等。我的显示刷新仍然比我需要的慢。
我意识到这有点含糊。我想了解的是,对于Windows CE 6.0及其多线程和Windows窗体的实现等,是否有一些我需要了解的技巧,以了解是否有方法可以提高窗体绘制的刷新率(例如,理想情况下确保至少每秒调用一次)。
发布于 2015-08-23 13:17:59
我不确定这是否有帮助,但请考虑以下内容:
不要在没有休眠的情况下运行线程。DO/While(TRUE)是错误的。Windows CE是多线程的,但分配给线程的时间片依赖于所有线程的合作,从而使操作系统有机会让位于另一个线程。
不要在整个表单上使用无效或刷新。如果您要显示来自不同线程的信息列表,则只允许线程更新其在GUI中的部分。
您可以使用SendMessage而不是PostMessage来更新图形用户界面(与使用事件/委托形成对比)。SendMessage将被阻塞,直到消息被处理,所以只能从后台线程使用它。但SendMessage将确保在GUI线程上进行最快的更新(如果用于屏幕的一部分)。
您甚至可以使用消息队列将后台线程和GUI解耦。因此,将线程的所有更新发布到队列中,并在GUI上查看消息以对GUI进行更改。同样,不要在没有睡眠或WaitObject的情况下运行后台线程。
您可以使用无效/刷新来更新GUI,但只能在单个控件上使用它。在示例中:您有许多显示线程值的标签,当要更新线程值时,仅使分配给线程值的标签无效/引用,而不是整个表单。
您可以使用事件同步GUI更新和线程,因此线程将被阻塞,直到GUI触发事件以解除阻塞,例如,当GUI完成处理线程的更新消息时。
请注意,Windows CE不是实时操作系统。它使用协作多任务处理。单个线程可以消耗几乎所有的处理器时间。
可能做一个win32应用程序接口应用程序会提高速度,因为压缩框架代码(IL,GarbageCollection等)比本机代码慢。
https://stackoverflow.com/questions/32149596
复制相似问题