Multithreaded Gstreamer mit PyGTK Crashing (xcb_xlib_threads_sequence_lost)

Ich verstehe, dass man die UI nicht von anderen Threads in gtk oder Gesichtsfolgen aktualisieren soll, aber ich bin mir nicht sicher, wie ich das bei der Verwendung von gstreamer vermeiden kann.

Meine Anwendung stürzt von Zeit zu Zeit während der Video-Stream-Initialisierung mit einer folgenden Beschwerde:

 [xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called [xcb] Aborting, sorry about that. python: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed. 

In meinem Code habe ich gtk.thread_init() Anruf direkt am Anfang der GUI-Klasse hinzugefügt:

 import pygtk, gtk, gobject gtk.gdk.threads_init() 

(Ich habe auch versucht gobject.threads_init() , aber das scheint nicht anders). In einer separaten Klasse, die in einem separaten Thread läuft, tcpserversink ich einen Gstreamer-Stream zu einem tcpserversink (dieser Gstreamer-Thread ist bereits ein dritter Thread, wenn jemand bezahlt wird). Und dann bekommt ein weiterer Thread diese Daten, bevor er die Daten an xvimagesink am Ende xvimagesink .

Der xvimagesink braucht ein xvimagesink , und ich glaube, dass diese gstreamer Callback Funktion ist, wo manchmal gtk verrückt wird, wenn ich es zuordne:

 def on_sync_message(self, bus, message): ... if message_name == "prepare-xwindow-id": # Assign the viewport imagesink = message.src imagesink.set_property("force-aspect-ratio", True) imagesink.set_xwindow_id(self.window_handle.window.xid) 

Das self.window_handle ist ein Zeiger auf self.movie_window = gtk.DrawingArea() , der während der GUI-Initialisierung zugewiesen wurde.

TL, DR Gibt es eine sichere Möglichkeit, gtk mit gstreamer zu verwenden, da ich es nicht vermeiden kann, beim Anrufen von gst.Pipeline("name").set_state(gst.STATE_PLAYING) und Ansicht wird ein GTK-Zeichnungsbereich sein?

One Solution collect form web for “Multithreaded Gstreamer mit PyGTK Crashing (xcb_xlib_threads_sequence_lost)”

Ich denke, dein Problem ist die Tatsache, dass du auf ungeschützte Xlib / xcb von 2 Threads zugreifen wirst – einmal implizit von deinem Gtk + UI und einmal in den Thread, wo dein Gstreamer Backend Callback ausgeführt wird – was standardmäßig das Mainloop ist, das du dem Gstreamer gesagt hast ( Oder das Thread-Standard-Mainloop).


gtk.gdk.threads_init() wird bereits aufgerufen, sobald das Typsystem initialisiert ist (wenn ich mich richtig erinnere, korrigiere mich wenn ich falsch gtk.gdk.threads_init() ).


Verwenden Sie g_idle_add (oder verwenden Sie GSource mit einer höheren Priorität) (die threadsafe sind) mit einem Rückruf, der UI-Änderungen im Gtk-Mainloop (läuft von gtk_main() ) plant.

  • Fehler beim Importieren von gtk mit python auf OS X
  • Virtualenv auf Ubuntu ohne Site-Pakete
  • Py2exe mit zope.interface arbeiten
  • Wie bekomme ich eine Liste aller Fenster auf meinem gnome2 Desktop mit pygtk?
  • Setzen Sie cellrenderertext Vordergrundfarbe ein, wenn eine Zeile markiert ist
  • Bearbeiten von GtkWidget-Attributen / Eigenschaften
  • Wie man Spalte bearbeitbar für ein bestimmtes Kind in pygtk macht
  • Speichern Sie gtk.DrawingArea in Datei
  • Konvertiere gtkglade zu libglade für eine rückwärtskompatibilität
  • Separate Threads in pygtk Anwendung
  • Python & PyGTK: Transportdaten zum Threading
  • Python ist die beste Programmiersprache der Welt.