Wie öffne ich ein Fenster für einen neuen Thread?

8

Ich habe ein Optionsfenster und ein Fenster, das Farbe basierend auf diesen Optionen und Kinect-Daten anzeigt. Bis jetzt ist alles auf einem Thread (soweit ich weiß; ich habe kein Threading gemacht).

Nun füge ich eine Option hinzu, um ein Viewer-Fenster zu öffnen, das mit der geringstmöglichen Latenz aktualisiert werden muss. All dies führt zu einem Fenster und zeigt es:

%Vor%

Wenn dieses Ereignis ausgelöst wird, hört das Farbfenster auf, Farben anzuzeigen (d. h. das Ereignis, das 30-mal pro Sekunde auf dem Haupt-Thread ausgelöst wird, hört auf zu schießen), aber der Viewer wird perfekt angezeigt. Ich möchte, dass der Viewer und das Farbfenster beide aktualisiert werden.

Wenn Sie andere Fragen lesen, klingt es nach der Lösung, den Viewer in einem neuen Thread zu erstellen. Ich habe jedoch eine Menge Probleme damit.

Dies wird ausgelöst, wenn ich auf die Schaltfläche klicke, um den Viewer zu öffnen:

%Vor%

Unabhängig davon, ob ich viewer.Show () oder Invoke () wie oben beschrieben aufruft, gibt die Zeile eine Ausnahme aus: Ein DependencyObject, das zu einem anderen Thread als dem übergeordneten Freezable gehört, kann nicht verwendet werden. So verstehe ich Invoke (): Es greift auf den Dispatcher des Viewers zu, der weiß, auf welchem ​​Thread das Objekt läuft, und kann dann Methoden aus diesem Thread aufrufen.

Soll ich diesen Viewer auf einen neuen Thread setzen? Ist das Problem auch eine Frage von Threads? Der Benutzer wird nicht mit dem Viewer interagieren.

Wer weiß, warum das nicht funktioniert? Danke für die Hilfe.

    
michael.greenwald 22.01.2012, 00:24
quelle

3 Antworten

15

Sie müssen Show() für denselben Thread aufrufen, auf dem das Fenster erstellt wurde - deshalb erhalten Sie den Fehler. Dann müssen Sie auch eine neue Dispatcher-Instanz starten, damit die Laufzeitumgebung das Fenster verwaltet.

%Vor%

Siehe das Beispiel für mehrere Windows / mehrere Threads unter: Ссылка

    
shf301 22.01.2012, 00:58
quelle
1

Ich stieß also auf ein ähnliches Problem, bei dem ein neues Fenster bei einem neuen Thread nicht geöffnet werden konnte. Die Ausnahme war "kann kein Abhängigkeitsobjekt verwenden, das zu einem anderen Thread gehört".

Das Problem bestand darin, dass das Fenster eine globale Ressource verwendete (Hintergrundpinsel). Sobald ich die Pinselressource erstarrte, lud das Fenster ganz gut.

    
bwing 28.01.2014 20:30
quelle
0

Ich bin nicht sicher, ob dies Ihr Problem lösen wird, aber können Sie versuchen, einen Thread-Proc (um ein Viewer-Fenster zu öffnen) erstellen, der auf einem anderen Thread ausgeführt wird und dann einen Dispatcher.beginInvoke hat, um das Hauptfenster zu aktualisieren,

Hier ist ein Code -

%Vor%

Damit können Sie die Steuerelemente des Hauptfensters aktualisieren, ohne es einzufrieren. Lassen Sie mich wissen, wenn Sie Fragen haben

    
DotNetUser 22.01.2012 00:48
quelle

Tags und Links