4 Stimmen

Formulare GUI Video-Thread-Kommunikation

Ich erstelle einen benutzerdefinierten Videoplayer in einem C#-Formular. Derzeit hat der Player eine Initialisierungs- und Shutdown-Routine und einen Thread, der im Hintergrund läuft und Videobilder liest und anzeigt. Ich bin ein ziemlicher Neuling in C#, also versuche ich herauszufinden, wie man am besten den Start \stop\pause Befehle vom GUI-Thread zum Video-Thread. Sollte ich einfach eine Statusvariable verwenden, die mit einer Sperre geschützt ist, und diese jedes Mal von meinem Video-Thread abfragen; gibt es irgendwelche anderen Empfehlungen?

Merci.

1voto

GazTheDestroyer Punkte 20048

Eine abgefragte Zustandsvariable scheint die einfachste Lösung zu sein, wenn der Video-Thread regelmäßig genug wiederholt wird.

Möglicherweise benötigen Sie nicht einmal eine Sperre, so dass die Statusvariable volatile sollte in C# ausreichen, sofern nur ein Thread sie aktualisiert. ( volatile in C# hat eine etwas andere Semantik als in C und sollte garantieren, dass der andere Thread den neuen Wert aufnimmt)

0voto

Regfor Punkte 8167

Es sind mehrere Wege möglich. Da Sie neu in C# sind und wahrscheinlich eng an die Benutzeroberfläche gekoppelt sind, schlage ich Ihnen vor, die BackgroundWorker-Klasse zu verwenden.

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

Sie können Ihre Argumente mit DoWorkEventArgs des DoWork-Ereignisses übergeben. Mit einem solchen Ansatz und ohne gemeinsam genutzte Objekte (durch Threads) können Sie auch die Verwendung von Sperren oder Synchronisierung vermeiden

Ich denke, das könnte die beste Lösung für Sie sein, aber es gibt auch Alternativen. Sie können Asynchronous Programming Model (APM) oder sogar Thread/ThreadPool oder Task Parallel Library verwenden.

Sollte ich nur eine Zustandsvariable mit einer Sperre geschützt verwenden und diese jedes Mal um meine >>Video-Thread abrufen; gibt es andere Empfehlungen?

Wenn Sie einen gemeinsam genutzten Zustand wie einen Video-Thread haben, sollten Sie die Thread-Synchronisierung verwenden. Die Antwort lautet also: Ja, Sie sollten eine geschützte Variable verwenden. Sie können Sperren vermeiden, indem Sie nur volatile verwenden, aber überlegen Sie sich, ob Sie nicht andere Sync-Primitive verwenden sollten. Denn die Verwendung von volatile stellt nur sicher, dass Sie den aktuellsten Wert lesen/schreiben, aber es verhindert nicht, dass andere Threads lesen/schreiben.

Einige Links zu wählen, ob Sperre (andere Primitive) oder nur eine flüchtige zu verwenden:

Muss ich sperren oder markieren als flüchtig beim Zugriff auf eine einfache boolesche Flagge in C#?

Flüchtig vs. Verriegelt vs. Sperre

0voto

Sie sollten in der Lage sein, den DirectShow-Filtergraphen ohne Einschränkungen zu starten/stoppen/pausieren. Dies würde entsprechende Methodenaufrufe auf Ihrem Quellfilter verursachen (weitere Informationen finden Sie unter Staaten filtern ). Der Quellfilter muss den Hintergrund-Thread über die Zustandsänderung informieren, sofern dies noch nicht geschehen ist.

Die Synchronisation kann auf die gleiche Weise wie in DirectShow-Klassen implementiert werden, wobei zwei AutoResetEvent Instanzen verwendet, eine, um den Hintergrund-Thread über eine neue Anfrage zu informieren, und eine, um den aufrufenden Thread über den Abschluss der Anfrageverarbeitung zu informieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X