2009-09-15 24 views
0

我的程序由一個大型圖形UI控件組成,我需要花費大約15秒的時間每隔一段時間加載一次。因爲更新代碼主要與UI控件一起工作(可能有90%實際上是在控件上設置屬性),所以讓我真正讓UI線程處理它是有意義的。我真的不希望控件在從UI單獨加載的同時加載可視化對象。使用WPF應用程序的UI線程在UI元素上執行長處理任務,但也在同一窗口上更新進度條

我也想要一個進度條來更新以及生活在同一個應用程序窗口的狀態欄中。在這種情況下是否有辦法打破規則並重新繪製進度條,或者是否應該爲進度條打開一個新的應用程序窗口?

你會在這種特殊情況下做什麼?

回答

2

如果您可以在很多步驟中打破主要任務(即更新圖形),則可以將每個步驟作爲單獨的調度程序消息執行。這將允許處理其他消息,包括讓您能夠更新進度信息。

的基本模式是:

  1. 調用你的首要任務,以零爲合格的一步。
  2. 執行此步驟。
  3. 如果有更多的步驟,隊列中的另一個消息,傳遞步驟+ 1。

您可以在進度更新在你的代碼中的適當位置,然後添加。

PS。不要說這是你最好的選擇 - 很難說不知道所有的細節。但是這是一個選擇。

0

查找效率更高的圖形UI控件。除非UI線程產生消息循環,否則任何其他更新都不會發生(並且會減慢圖形控件的更新)。

+0

大部分時間更新只有2到5秒,但可能會達到極端20秒。你只是住在一起,忘記進度條?不幸的是,現在不可能找到更好的圖形控制。 – 2009-09-15 09:02:07

0

我會建議在新窗口中使用進度條(不帶表格標題)。通過讀取圖形控件的共享屬性來繪製進度條。這種方式可以避免線程阻塞(加載緩慢)。並且它可以爲您提供良好的視覺體驗(兩個控件上的漸進式繪畫)。

1

It is not really true that there is only one UI thread in an application,只是大多數Windows應用程序只在一個線程中創建UI對象,所以這個線程變成應用程序中的「UI」線程。很容易理解爲什麼 - 這使得代碼更易於理解,並保護我們免受控件之間的隱式線程綁定問題的困擾。

這表明一個可能的想法,如果證明不可能提高更新控制的速度(這是我建議先做的)。在單獨的線程上創建UI控件。您需要確保該線程適用於UI,that is to say the threading model is STA,並且它會在控制銷燬之前泵送消息並且不會死亡。我不知道是否需要在UI線程中創建父窗口,或者只是在控件中創建父窗口,但在這裏可能值得嘗試。

+0

您無法在線程A上創建控件,然後將其添加到您在線程B上創建的控件。如果你嘗試,你會得到一個InvalidOperationException:「調用線程不能訪問這個對象,因爲不同的線程擁有它。」窗口內的所有內容必須位於同一個線程中。也就是說,如果進度條線程有自己的窗口,可以使其工作。 – 2009-09-15 13:17:21

相關問題