У меня есть окно параметров и окно, которое отображает цвет на основе этих параметров и данных Kinect. Пока все на одном потоке (насколько я знаю, я не делал ниток).Как открыть окно в новом потоке?
Теперь я добавляю возможность открыть окно просмотра, которое необходимо будет обновить с минимально возможной задержкой. Все это влечет за собой создание окна и показывать его:
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
Когда это событие происходит, окно цвета перестает отображать цвета (то есть событие, которое срабатывает в 30 раз в секунду на основном потоке прекращает стрельбу), но зритель отображается отлично. Я хочу, чтобы зритель и окно цвета были обновлены.
Из чтения других вопросов, похоже, решение состоит в том, чтобы создать зрителя в новом потоке. Тем не менее, я столкнулся с множеством проблем.
This пожары, когда я нажимаю на кнопку, чтобы открыть зрителю:
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(): он обращается к диспетчеру зрителя, который знает, в какой поток работает объект, и затем может вызывать методы из этого потока.
Должен ли я пытаться поместить этот зритель в новый поток? Является ли проблема даже вопросом нитей? Пользователь не будет взаимодействовать со зрителем.
Кто-нибудь знает, почему это не работает? Спасибо за помощь.
Я вижу Invoke как гарантию того, что Show() вызывается в потоке зрителя , Даже без Invoke() вокруг viewer.Show(), я все еще получаю исключение Freezable. –
@ michael.greenwald Тогда в 'SkeletalViewer.MainWindow()' есть что-то, что вызывает исключение. Я построил пустой проект WPF, который делает то, что я показываю выше, и работает без исключения. Возможно, вы выпускаете аналогично проблеме из этого вопроса: http://stackoverflow.com/questions/3636761/how-to-debug-this-error-when-none-of-my-code-shows-up-in- the-stack – shf301
И как закрыть это окно из 'launchViewerThread'? –