2012-03-05 68 views
3

長話短說,我需要放置一個WinForms Panel和一個非託管類的實例,它將它繪製在單獨的線程中以保持主窗口響應( SDK有時需要花費幾秒鐘的時間才能得出它將要繪製的內容,並且它正在執行此操作會阻止UI線程)。我其實需要很多(最多32個),但我們現在只談一個;這個概念應該能夠根據需要多次複製。爲窗體的嵌套控件創建多個消息循環

我想我需要做的是啓動一個新的線程,它將「新建」一個Panel,然後啓動一個與特定任何東西無關的ApplicationContext,並將其分配給面板。然後,Panel類應該有一個Dispose()重載,它將結束ApplicationContext,關閉消息泵並終止線程。

我需要知道的是:

  • 可以在面板被放置在裏面的IContainer,或添加到任何父對象的Controls集合?或者,這樣做會導致非線程安全的調用?
  • 我有一個在新線程上創建新實例的類的靜態工廠方法。我需要從該方法返回對該面板的引用(在後臺線程中創建),以便我可以使用它。有沒有更好的方法來做,而不是在後臺線程設置的靜態方法中在本地定義的變量的while/sleep循環中等待呢?
  • 我是否需要保留對擁有面板的線程的引用?
  • 我瘋了試試嗎?

回答

6

你不應該這樣來解決問題。您應該將繪圖線程繪製到內存中的圖像,並讓UI線程將這些圖像呈現給面板。如果繪圖線程爲每次迭代生成一個新圖像,則UI線程可以緩存圖像並在每次新圖像可用時將其替換。稍後您將爲自己節省很多麻煩,而不是試圖篡奪預期的線程行爲。

+3

+1:這被稱爲「離屏合成」。它被大多數應用程序使用,需要一段時間才能加載圖像,同時需要保持UI響應和無閃爍。這包括從遊戲引擎到瀏覽器的所有內容。 – NotMe 2012-03-06 00:40:47

+0

好主意;不過,我不認爲我有這種奢侈。 SDK期望一個HWnd來繪製,所以我非常肯定我必須給它一個Windows已知的GUI元素。 – KeithS 2012-03-07 15:07:33