Domanda

OK, quindi sto scrivendo un'app, che suona musica con i collegamenti pyGST.

Ciò richiede l'uso di thread per gestire la riproduzione. La libreria di bind gestisce la maggior parte del controllo del thread per me, il che è carino (e quello che stavo cercando in loro).

Ora, non ho una comprensione completa di questo concetto, quindi sarei desideroso di alcuni riferimenti. Ma per come lo capisco, devo sostanzialmente informare l'app che può usare più thread.

L'ho raccolto dal esempi sul sito gstreamer, dove usa questa chiamata:

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

secondo qui , questo dice all'app che può usare più thread (più o meno), da dove proviene la mia ipotesi sopra.

Questo è lo sfondo. Ora prendi questo. Ho inserito quelle righe nel mio codice e funzionano bene. La mia app riproduce musica invece di arresti anomali ogni volta che ci prova. Ma qualcosa non sembra giusto.
Negli esempi da cui ho preso quelle righe, usano gtk per l'intera GUI, ma voglio usare wxWidgets, quindi mi sembra sbagliato chiamare questa funzione gtk per farlo.

Esiste un wx equivalente a questo? o va bene usarlo e funzionerà ancora su più piattaforme?

Inoltre, devo capire come uccidere tutti questi thread all'uscita (cosa che non fa in questo momento) Vedo come lo fanno nell'esempio usando di nuovo un metodo gtk, quindi di nuovo, cercando un equivalente wx .

PS: penso che questo (o la soluzione) possa essere correlato alla funzione wx.App.MainLoop (), ma mi sono perso nel tentativo di capire come funziona questo ciclo, quindi, ancora, si apprezzerebbero buoni riferimenti a riguardo , ma suppongo che non sia necessario finché avrò una buona soluzione.

È stato utile?

Soluzione

Prova invece a utilizzare questo:

import gobject
gobject.threads_init()

Mi chiedo come mai non sia scritto in caratteri grandi all'inizio di ogni documentazione del plugin python gstreamer: mi ci sono volute solo diverse ore per trovarlo.

Un po 'più di dettagli qui .

Altri suggerimenti

Non ho esperienza con pyGST, ma il consiglio generale per l'uso di thread e wxPython è di aggiornare la GUI solo dal thread principale (cioè il thread che avvia MainLoop). Vedi http://wiki.wxpython.org/LongRunningTasks per maggiori informazioni.

Non ho esperienza con i collegamenti python, ma ho avuto successo usando wxWidgets e GStreamer insieme su Windows. Il problema è che wxWidgets esegue un loop di eventi di Windows mentre GStreamer utilizza un loop di eventi GLib. Se non ti interessa nessuno degli eventi GStreamer, non dovresti fare nulla. Tuttavia, se ti interessa ricevere uno degli eventi GStreamer, dovrai eseguire il tuo ciclo di eventi GLib (GMainLoop) in un thread separato con un GMainContext separato. Utilizzare gst_bus_create_watch per creare una sorgente di eventi GST, aggiungere un callback alla sorgente con g_source_set_callback e quindi collegarlo al contesto principale del ciclo degli eventi GLib con g_source_attach. È quindi possibile gestire GST nel callback, ad esempio, per inoltrare gli eventi al ciclo degli eventi principali di wx.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top