использование потоков и pyGST в приложении wx python

StackOverflow https://stackoverflow.com/questions/815255

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top