Разбирам, че не трябва да се актуализира потребителският интерфейс от други нишки в gtk
или да се изправят пред последствия, но не съм сигурен как мога да избегна това, докато използвам gstreamer
.
Моето приложение се срива от време на време по време на инициализация на видеопоток със следното оплакване:
[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.
В моя код добавих gtk.thread_init()
повикване точно в началото на GUI класа:
import pygtk, gtk, gobject
gtk.gdk.threads_init()
(Опитах също gobject.threads_init()
, но това не изглежда различно). В отделен клас, който се изпълнява в отделна нишка, стартирам gstreamer поток към tcpserversink
(тази gstreamer нишка вече е трета нишка, ако някой държи сметката). И след това друга нишка получава тези данни, преди да прехвърли данните към xvimagesink
в крайна сметка.
xvimagesink
се нуждае от прозорец за изглед и вярвам, че тази функция за обратно извикване на gstreamer е мястото, където gtk понякога полудява, когато я присвоя:
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)
self.window_handle
е указател към self.movie_window = gtk.DrawingArea()
, зададен по време на инициализацията на GUI.
TL;DR Има ли безопасен начин за използване на gtk с gstreamer, тъй като не мога да избегна нишката при извикване на gst.Pipeline("name").set_state(gst.STATE_PLAYING)
и изгледът ще бъде област за рисуване на GTK?