Ho una finestra delle opzioni e una finestra che visualizza il colore in base a queste opzioni e ai dati Kinect. Finora tutto è su un thread (per quanto ne so, non ho fatto nessuna discussione).Come si apre una finestra su una nuova discussione?
Ora, sto aggiungendo un'opzione per aprire una finestra del visualizzatore che dovrà essere aggiornata con la latenza più bassa possibile. Tutto ciò comporta sta creando una finestra e mostrarlo:
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
quando gli incendi di questo evento, la finestra di colore ferma visualizzazione dei colori (cioè l'evento che spara 30 volte al secondo sul thread principale si ferma cottura), ma lo spettatore viene visualizzato perfettamente. Voglio che il visualizzatore e la finestra dei colori siano entrambi aggiornati.
Dalla lettura di altre domande, sembra che la soluzione sia creare il visualizzatore su una nuova discussione. Sto incontrando molti problemi con questo, però.
Questo incendi quando si fa clic sul pulsante per aprire il visualizzatore:
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();
}
Indipendentemente se mi basta chiamare viewer.Show() o Invoke() come sopra, la linea genera un'eccezione: Impossibile utilizzare un oggetto DependencyObject appartenente a un thread diverso rispetto a Freezable padre. Ecco come intendo Invoke(): accede al dispatcher del visualizzatore, che conosce il thread su cui è in esecuzione l'oggetto e può quindi chiamare i metodi da quel thread.
Dovrei provare a mettere questo visualizzatore su una nuova discussione? Il problema è anche una questione di thread? L'utente non interagirà con il visualizzatore.
Qualcuno sa perché questo non funziona? Grazie per l'aiuto.
Vedo l'Invoke come garanzia che Show() viene chiamato sul thread del visualizzatore . Anche senza Invoke() attorno al viewer.Show(), ottengo ancora l'eccezione Freezable. –
@ michael.greenwald Poi c'è qualcosa in 'SkeletalViewer.MainWindow()' che sta causando l'eccezione. Ho creato un progetto WPF vuoto che fa esattamente quello che mostro sopra e funziona senza eccezioni. Forse il problema è simile al problema di questa domanda: http://stackoverflow.com/questions/3636761/how-to-debug-this-error-when-none-of-my-code-shows-up-in- the-stack – shf301
E come chiudere quella finestra da 'launchViewerThread'? –