использование потоков и pyGST в приложении wx python
-
03-07-2019 - |
Вопрос
Хорошо, я пишу приложение, которое воспроизводит музыку с привязками pyGST.
Это требует использования потоков для обработки воспроизведения. Библиотека bindings обрабатывает большую часть управления потоками для меня, что приятно (и то, что я искал в них).
Теперь я не совсем разбираюсь в этой концепции, поэтому я бы с нетерпением ждал некоторых ссылок. Но, насколько я понимаю, я должен сообщить приложению, что оно может использовать несколько потоков. Р>
Я получил это из примеров на сайте gstreamer, где они используйте этот вызов:
gtk.gdk.threads_init()
gtk.main()
в соответствии с здесь , это говорит приложению, что оно может использовать несколько потоков (более или менее), отсюда и моё предположение.
Это фон. Теперь возьми это. Я поместил эти строки в мой код, и они работают нормально. Мое приложение воспроизводит музыку, а не падает, когда пытается. Но что-то не так.
В примерах, из которых я получил эти строки, они используют gtk для всего графического интерфейса, но я хочу использовать wxWidgets, поэтому неправильно вызывать эту функцию gtk для этого.
Есть ли wx-эквивалент этого? или это нормально, и он все еще будет работать кроссплатформенно?
Кроме того, я должен выяснить, как убить все эти потоки при выходе (чего он сейчас не делает). Я вижу, как они делают это в примере, снова используя метод gtk, и снова, ища эквивалент wx. , Р>
PS: я думаю, что это (или решение) может быть связано с функцией wx.App.MainLoop (), но я теряюсь, пытаясь понять, как работает этот цикл, поэтому, опять же, хорошие ссылки по этому поводу были бы оценены , но я думаю, что нет необходимости, если у меня есть хорошее решение.
Решение
Попробуйте использовать это вместо:
import gobject
gobject.threads_init()
Интересно, почему он не написан крупным шрифтом в начале каждой документации к плагину Python gstreamer: мне понадобилось всего несколько часов, чтобы найти его.
Немного больше информации здесь .
Другие советы
У меня нет опыта работы с pyGST, но общий совет по использованию потоков и wxPython - обновлять графический интерфейс только из основного потока (то есть потока, который запускает MainLoop). См. http://wiki.wxpython.org/LongRunningTasks для получения дополнительной информации.
У меня нет опыта работы с привязками python, но я успешно использовал wxWidgets и GStreamer вместе в Windows. Проблема в том, что wxWidgets запускает цикл событий Windows, а GStreamer использует цикл событий GLib. Если вас не волнует какое-либо из событий GStreamer, вам не нужно ничего делать. Однако, если вы хотите получить какое-либо из событий GStreamer, вам придется запустить свой собственный цикл событий GLib (GMainLoop) в отдельном потоке с отдельным GMainContext. Используйте gst_bus_create_watch для создания источника событий GST, добавьте обратный вызов к источнику с помощью g_source_set_callback, а затем присоедините его к основному контексту вашего цикла событий GLib с помощью g_source_attach. Затем вы можете обработать GST в обратном вызове, например, чтобы переслать события в основной цикл событий wx.