Question

OK, j'écris donc une application qui joue de la musique avec les liaisons pyGST.

Ceci nécessite l'utilisation de threads pour gérer la lecture. La bibliothèque de liaisons gère la plupart des contrôles de threads pour moi, ce qui est agréable (et ce que je cherchais dessus).

Maintenant, je n’ai pas une compréhension complète de ce concept, alors je voudrais avoir quelques références. Mais si je comprends bien, je dois essentiellement informer l’application qu’elle peut utiliser plusieurs threads.

J'ai recueilli cette information à partir des exemples sur le site gstreamer, où ils utiliser cet appel:

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

selon ici , cela indique à l’application qu’elle peut utiliser plusieurs threads (plus ou moins), d’où mon hypothèse précédente.

C'est le fond. Maintenant, prenez ceci. J'ai placé ces lignes dans mon code et elles fonctionnent bien. Mon application joue de la musique plutôt que de s'écraser à chaque tentative. Mais quelque chose ne va pas.
Dans les exemples dont je tire ces lignes, ils utilisent gtk pour l’ensemble de l’interface graphique, mais je veux utiliser wxWidgets. Il est donc erroné d’appeler cette fonction gtk pour le faire.

Existe-t-il un équivalent wx à ceci? ou est-il acceptable de l'utiliser, et cela fonctionnera-t-il toujours sur plusieurs plates-formes?

De plus, je dois trouver un moyen de tuer tous ces threads à la sortie (ce qu’il ne fait pas pour le moment). Je vois comment ils le font dans l’exemple en utilisant à nouveau une méthode gtk, donc à la recherche d’un équivalent wx. .

PS: Je pense que ceci (ou la solution) peut être lié à la fonction wx.App.MainLoop (), mais je suis perdu à essayer de comprendre comment cette boucle fonctionne. Encore une fois, de bonnes références à ce sujet seraient appréciées , mais je suppose que ce n’est pas nécessaire tant que j’ai une bonne solution.

Était-ce utile?

La solution

Essayez plutôt d'utiliser ceci:

import gobject
gobject.threads_init()

Je me demande comment il se fait qu'il ne soit pas écrit en gros caractères au début de chaque document de documentation du plug-in python gstreamer: il ne m'a fallu que plusieurs heures pour le trouver.

Un peu plus de détails ici .

Autres conseils

Je n'ai aucune expérience de pyGST, mais le conseil général pour utiliser les threads et wxPython est de ne mettre à jour que l'interface graphique à partir du thread principal (c'est-à-dire le thread qui démarre MainLoop). Pour plus d'informations, consultez http://wiki.wxpython.org/LongRunningTasks .

Je n'ai aucune expérience des liaisons Python, mais j'ai réussi à utiliser wxWidgets et GStreamer ensemble sous Windows. Le problème est que wxWidgets exécute une boucle d’événements Windows tandis que GStreamer utilise une boucle d’événements GLib. Si vous ne vous souciez pas de l'un des événements GStreamer, vous ne devriez rien faire. Toutefois, si vous souhaitez recevoir l'un des événements GStreamer, vous devrez exécuter votre propre boucle d'événement GLib (GMainLoop) dans un thread séparé avec un autre GMainContext. Utilisez gst_bus_create_watch pour créer une source d'événements GST, ajoutez un rappel à la source avec g_source_set_callback, puis attachez-le au contexte principal de votre boucle d'événements GLib avec g_source_attach. Vous pouvez ensuite gérer la TPS dans le rappel, par exemple, pour transférer les événements à la boucle d'événements principale wx.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top