2009-05-02 6 views
0

OK, also ich schreibe eine App, die Musik mit den pyGST Bindungen spielt.mit Threads und pyGST in einer Wx Python App

Dies erfordert die Verwendung von Threads für die Wiedergabe. Die Bindings-Bibliothek übernimmt den Großteil der Thread-Kontrolle für mich, was nett ist (und was ich darin gesucht habe).

Jetzt habe ich dieses Konzept nicht mehr im Griff, daher würde ich mich auf einige Referenzen freuen. Aber so wie ich es verstehe, muss ich die App grundsätzlich darüber informieren, dass sie mehrere Threads verwenden kann.

Ich sammelte diese vom examples auf dem gstreamer Ort, wo sie diesen Aufruf benutzen:

gtk.gdk.threads_init() 
gtk.main() 

nach here, das die App sagt es kann mehrere Threads verwenden (mehr oder weniger), die in dem meine obige Annahme kam von.

Das ist der Hintergrund. Jetzt hol dir das. Ich habe diese Zeilen in meinen Code eingefügt, und sie funktionieren gut. Meine App spielt Musik ab und stürzt nicht ab, wenn sie es versucht. Aber etwas fühlt sich nicht richtig an.
In den Beispielen, aus denen ich diese Zeilen habe, verwenden sie gtk für die gesamte GUI, aber ich möchte wxWidgets verwenden, also fühlt es sich falsch an, diese gtk-Funktion dazu aufzurufen.

Gibt es ein Wx-Äquivalent? oder ist es in Ordnung, dies zu verwenden, und wird es weiterhin plattformübergreifend funktionieren?

Auch ich muss herausfinden, wie alle diese Threads beim Beenden (was es nicht gerade tut) Ich sehe, wie sie es im Beispiel mit einer gtk-Methode wieder tun, so wieder, auf der Suche nach einem Wx gleichwertig.

PS: Ich denke, dass dies (oder die Lösung) mit der Funktion wx.App.MainLoop() verwandt sein kann, aber ich bin verloren zu versuchen, zu verstehen, wie diese Schleife funktioniert, also wieder gute Hinweise dazu wäre geschätzt, aber ich denke nicht notwendig, solange ich eine gute Lösung habe.

Antwort

1

Versuchen Sie, diese anstelle:

import gobject 
gobject.threads_init() 

Ich frage mich, wie kommt es nicht in Großdruck zu Beginn eines jeden Python GStreamer-Plugin Stück Dokumentation geschrieben: es mir nur einige Stunden in Anspruch nahm, es zu finden.

Ein bisschen mehr Details here.

+0

Ich denke, das löst das. es impliziert, dass es keinen Unterschied macht, ob ich die gtk-Methode oder die gobject-Methode verwende. aber gut. – gnomed

0

Ich habe keine Erfahrung mit pyGST, aber der allgemeine Hinweis für die Verwendung von Threads und wxPython ist nur die GUI aus dem Haupt-Thread (d. H. Der Thread, der MainLoop startet) zu aktualisieren. Weitere Informationen finden Sie unter http://wiki.wxpython.org/LongRunningTasks.

+0

Ja, das ist irgendwie der Track, auf dem ich mit dem MainLoop war. Ich muss nur etwas graben für die pyGST Ereignisse und so. Ich werde dir das sicher geben, wenn es klappt. Danke, froh, dass endlich jemand auf eine Antwort geschossen hat. – gnomed

0

Ich habe keine Erfahrung mit den Python-Bindungen, aber ich hatte Erfolg mit WxWidgets und GStreamer zusammen unter Windows. Das Problem ist, dass wxWidgets eine Windows-Ereignisschleife ausführt, während GStreamer eine GLib-Ereignisschleife verwendet. Wenn Sie sich für keine der GStreamer-Ereignisse interessieren, sollten Sie nichts tun müssen. Wenn Sie jedoch einen der GStreamer-Ereignisse erhalten möchten, müssen Sie Ihre eigene GLib-Ereignisschleife (GMainLoop) in einem separaten Thread mit einem separaten GMainContext ausführen. Verwenden Sie gst_bus_create_watch, um eine GST-Ereignisquelle zu erstellen, fügen Sie der Quelle mit g_source_set_callback einen Rückruf hinzu und hängen Sie sie dann mit g_source_attach an den Hauptkontext Ihrer GLib-Ereignisschleife an. Sie können dann die GST im Callback behandeln, z. B. um die Ereignisse an die wx-Hauptereignisschleife weiterzuleiten.

+0

Ich mag die Idee, nichts tun zu müssen, und ich interessiere mich nicht wirklich für die Ereignisse. aber mein Problem ist, dass, wann immer ich versuche zu spielen ("playbin.set_state (gst.STATE_PLAYING)") irgendwas mit GStreamer, es spielt nur so lange, wie diese Methode (die den Zustand setzt) ​​aktiv ist, was bedeutet, dass die GUI ' Wenn ich etwas anderes mache, während ich spiele, und ich würde etwas wie eine leere Schleife einfügen müssen, um die Methode aktiv zu halten, um etwas zu hören (es dauerte ewig, bis ich merkte, dass dies mein Problem war). Andernfalls kehrt die Methode zurück, bevor ich einen Piepston höre. : s – gnomed

+0

Wirklich? set_state war immer nicht blockierend mit irgendeinem der GStreamer-Elemente, die ich benutzt habe. Rufen Sie gtk.main() über den GUI-Thread auf, da dies blockiert wird. Wenn set_state tatsächlich blockiert, können Sie wxThread von der Unterklasse ableiten und die Entry-Methode überschreiben, um set_state aufzurufen. Führen Sie dann über die GUI einen Thread.Create() gefolgt von thread.Run() aus, um den Thread zu starten. Hoffe das hilft. –

+0

Ich habe dieses Problem nicht, wenn ich gtk.main() nenne (zusammen mit gtk.thread_init()) Aber wie ich oben sage, mag ich nicht die Idee, gtk speziell zu verwenden, ich will es non-blocking ohne zu müssen Rufen Sie dies an und bleiben Sie bei der wx-API. – gnomed