У меня есть окно параметров и окно, в котором отображается цвет на основе этих параметров и данных 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 (), как указано выше, строка выдает исключение: Невозможно использовать DependencyObject который принадлежит другому потоку, чем его родительский Freezable. Вот как я понимаю Invoke (): он обращается к диспетчеру средства просмотра, который знает, в каком потоке выполняется объект, и затем может вызывать методы из этого потока.
Следует ли мне добавить эту программу просмотра в новую ветку? Проблема даже в нитях? Пользователь не будет взаимодействовать со зрителем.
Кто-нибудь знает, почему это не работает? Спасибо за помощь.