我有一个选项窗口和一个窗口,根据这些选项和Kinect数据显示颜色.到目前为止,一切都在一个线程上(据我所知;我没有做任何线程).
现在,我正在添加一个选项来打开一个需要以尽可能低的延迟进行更新的查看器窗口.所有这一切都需要创建一个窗口并显示它:
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
Run Code Online (Sandbox Code Playgroud)
当此事件触发时,颜色窗口停止显示颜色(即主线程上每秒触发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();
}
Run Code Online (Sandbox Code Playgroud)
无论我是否如上所述调用viewer.Show()或Invoke(),该行都会抛出异常:不能使用属于与其父Freezable不同的线程的DependencyObject.这是我理解Invoke()的方式:它访问查看器的调度程序,它知道运行该对象的线程,然后可以从该线程调用方法.
我应该尝试将此查看器放在新线程上吗?问题甚至是线程问题吗?用户不会与观看者交互.
任何人都知道为什么这不起作用?谢谢您的帮助.
我整个星期都在尝试这个,但是,对于我的生活,我不能想出来.
我知道我需要一个辅助函数来递归并返回pathSoFar.我似乎无法理解递归.
我很困惑,除了递归之外,我甚至无法确切地解决问题.
谢谢你的帮助.
编辑:好的,我会澄清一点.令我困惑的一件事是当节点没有邻居时返回什么路径.可以首先返回目标路径,但是,因为帮助程序仍在递归,它可以返回死端路径.我想我对回溯感到困惑.