gpt4 book ai didi

c# - 如何在新线程上打开一个窗口?

转载 作者:可可西里 更新时间:2023-11-01 08:59:43 39 4
gpt4 key购买 nike

我有一个选项窗口和一个根据这些选项和 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() 还是 Invoke(),该行都会抛出异常:不能使用与其父 Freezable 属于不同线程的 DependencyObject。以下是我对 Invoke() 的理解:它访问查看器的调度程序,它知道对象正在哪个线程上运行,然后可以从该线程调用方法。

我应该尝试将此查看器置于新线程中吗?问题甚至是线程问题吗?用户不会与观看者互动。

有人知道为什么这行不通吗?感谢您的帮助。

最佳答案

您需要在创建窗口的同一线程上调用 Show() - 这就是您收到错误的原因。然后你还需要启动一个新的 Dispatcher 实例来获取运行时来管理窗口。

private void launchViewerThread_Click(object sender, RoutedEventArgs e)
{
Thread viewerThread = new Thread(delegate()
{
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
System.Windows.Threading.Dispatcher.Run();
});

viewerThread.SetApartmentState(ApartmentState.STA); // needs to be STA or throws exception
viewerThread.Start();
}

参见多窗口/多线程示例:http://msdn.microsoft.com/en-us/library/ms741870.aspx

关于c# - 如何在新线程上打开一个窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957969/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com