2011-01-12 71 views
1

[遺憾的是英語不是我的母語。]如何在已更新的情況下跳過UI更新?

所以,我有一個UI和1名工人在另一個線程,工人將調用用戶界面更新()中隨機頻率, 所以有可能是一個很多Update()被調用到UI。但是,如果真的有多個Update(),那麼只有最新的一個是有意義的,但我無法跳過這兩者之間的。

所以我想

  1. 「檢測是否有更新()持續的,如果是的話,就掛起1次更多更新()」

  2. 「檢查是否已經有1更更新()待定,那麼就沒有必要更掛起」 更新()

之前,但我不知道什麼是做到這一點的最好辦法。我想肯定有人遇到過這樣的問題。谷歌搜索只是給了我一些無關的結果。因此,我正在尋找一些模式或最佳做法或搜索關於此的條款或建議或建議。

非常感謝你

+0

@Brian:感謝您刪除這兩個標籤。當我看到你打我時,我也會這樣做。作爲標籤,「慢」和「跳」並不是真的有用。 – 2011-01-12 16:19:28

回答

1

好像你需要一個長度爲1的更新請求隊列。

產生UpdateRequests到隊列並放棄它們,如果隊列已滿......然後從另一個線程中消耗它們,實際上是最終更新調用到主線程。

0

如果您始終要保證UI線程檢索到的值是推送的最後一個值,請考慮您在UI線程和後臺線程之間共享的數據的堆棧結構。您仍然需要鎖定共享數據,以確保UI線程不會收到「過時」更新。

下面是在C#中的Stack類的引用:
http://msdn.microsoft.com/en-us/library/system.collections.stack.aspx

根據文檔:

線程安全
公共靜態(共享 在Visual Basic)的這個成員類型 是線程安全的。任何實例成員 不保證是線程安全的。

爲保證 堆棧的線程安全,所有操作必須通過 同步方法返回的包裝完成 。

枚舉整個集合是 本質上不是線程安全的 過程。即使集合是 同步,其他線程仍然可以 修改集合,這將導致枚舉器引發 引發異常。 要在枚舉中保證線程安全,您可以在整個 枚舉期間鎖定 集合,或者捕獲由其他 線程所做更改產生的異常 。

編輯:
Jorge是右手也有Queue類,可能更適合:
http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx

2

目前尚不清楚你使用的是什麼樣的類庫。但是,調用Update()基本上是錯誤的。繪製用戶界面是一項低優先級任務,只有在沒有更重要的需要照顧時才能完成。

正確的事情是調用Invalidate()。你可以多次調用它,它不能'備份'。當UI線程準備好並且願意時,它將繪製用戶界面。如果更改發生得更快,那麼UI線程可以跟上然後沒有損害,中間漆不會發生。

這是一般你需要照顧的其他東西。每秒拍攝腳部並調用數百次非常簡單。這是毫無意義的,人類無法感知到速度的變化。每秒四十次是充足的,看起來和電影中的電影一樣流暢。實際上,你應該少用。

+0

這是假設他所指的Update()是.NET UI的「更新」,而不是他所具有的某個業務特定的更新,但我認爲它是一種安全的賭注。 – GWLlosa 2011-01-12 17:16:37

相關問題