Как мне открыть окно в новом потоке?

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

Следует ли мне добавить эту программу просмотра в новую ветку? Проблема даже в нитях? Пользователь не будет взаимодействовать со зрителем.

Кто-нибудь знает, почему это не работает? Спасибо за помощь.

10
задан michael.greenwald 22 January 2012 в 00:24
поделиться