我有一個選項窗口和一個基於這些選項和Kinect數據顯示顏色的窗口。到目前爲止,一切都在一個線程上(據我所知,我沒有做過任何線程)。如何在新線程上打開窗口?
現在,我添加了一個選項來打開一個查看器窗口,該窗口需要以儘可能低的延遲進行更新。所有這一切都需要是創建一個窗口,並示出它:
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
當這個事件觸發時,顏色窗口停止顯示的顏色(即,觸發該主線程上的30倍的第二事件停止擊發),但觀看者顯示完美。我希望查看器和顏色窗口都被更新。
從閱讀其他問題,這聽起來像解決方案是在一個新的線程創建查看器。不過,我遇到了很多問題。
該火災時,我點擊按鈕,打開瀏覽器:
private void launchViewerThread_Click(object sender, RoutedEventArgs e)
{
Thread viewerThread = new Thread(delegate()
{
viewer = new SkeletalViewer.MainWindow();
viewer.Dispatcher.Invoke(new Action(delegate()
{
viewer.Show();
}));
});
viewerThread.SetApartmentState(ApartmentState.STA); // needs to be STA or throws exception
viewerThread.Start();
}
不管,如果我只是叫viewer.Show()或調用(的),它上面的,行會拋出異常:無法使用屬於與其父級Freezable不同的線程的DependencyObject。下面是我理解Invoke()的方法:它訪問查看器的調度程序,該調度程序知道對象在哪個線程上運行,然後可以從該線程調用方法。
我應該試圖把這個查看器放在一個新的線程上嗎?問題甚至是線程問題嗎?用戶不會與觀衆交互。
任何人都知道爲什麼這不起作用?謝謝您的幫助。
我看到Invoke作爲保證Show()在瀏覽器的線程上被調用。即使在viewer.Show()周圍沒有Invoke(),我仍然會得到Freezable異常。 –
@ michael.greenwald然後在'SkeletalViewer.MainWindow()'中有一些東西導致異常。我構建了一個空的WPF項目,它完全符合我上面顯示的內容,並且它毫無例外地運行。也許你的問題類似於這個問題的問題:http://stackoverflow.com/questions/3636761/how-to-debug-this-error-when-none-of-my-code-shows-up-in-堆棧 – shf301
以及如何從'launchViewerThread'關閉那個窗口? –