簡體   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