我有一个选项窗口和一个基于这些选项和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'关闭那个窗口? –