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