Tengo una ventana de opciones y una ventana que muestra el color en función de estas opciones y los datos de Kinect. Hasta ahora, todo está en un hilo (hasta donde sé, no he hecho ningún enhebrado).¿Cómo abro una ventana en un nuevo hilo?
Ahora, estoy agregando una opción para abrir una ventana de visor que deberá actualizarse con la latencia más baja posible. Todo esto conlleva es la creación de una ventana y que lo muestra:
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
Cuando los incendios de este evento, el color de la ventana deja de mostrar colores (es decir, el evento que dispara 30 veces por segundo en el hilo principal deja de disparar), pero el espectador se muestra perfectamente. Quiero que el visor y la ventana de color se actualicen.
Al leer otras preguntas, parece que la solución es crear el visor en un nuevo hilo. Sin embargo, estoy teniendo muchos problemas con esto.
Este incendios cuando haga clic en el botón para abrir el visor:
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();
}
Independientemente de si acabo de llamar viewer.Show() o Invoke() como anteriormente, la línea se produce una excepción: No se puede usa un DependencyObject que pertenece a un hilo diferente de su Freezable padre. Así es como entiendo Invoke(): accede al despachador del visor, que sabe en qué subproceso se está ejecutando el objeto, y luego puede llamar a los métodos desde ese subproceso.
¿Debo intentar poner este visor en un nuevo hilo? ¿El problema es incluso una cuestión de hilos? El usuario no interactuará con el espectador.
¿Alguien sabe por qué esto no funciona? Gracias por la ayuda.
Veo la invocación como garantía de que se llama a Show() en el hilo del visor . Incluso sin Invoke() alrededor del espectador. Show(), todavía obtengo la excepción de Freezable. –
@ michael.greenwald Luego hay algo en 'SkeletalViewer.MainWindow()' que causa la excepción. Construí un proyecto WPF vacío que hace exactamente lo que muestro arriba y se ejecuta sin excepción. Tal vez su problema es similar al problema de esta pregunta: http://stackoverflow.com/questions/3636761/how-to-debug-this-error-when-none-of-my-code-shows-up-in- the-stack – shf301
¿Y cómo cerrar esa ventana de 'launchViewerThread'? –