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