【问题标题】:using threads and pyGST in a wx python app在 wx python 应用程序中使用线程和 pyGST
【发布时间】:2009-05-02 17:29:51
【问题描述】:

好的,所以我正在编写一个应用程序,它使用 pyGST 绑定播放音乐。

这需要使用线程来处理播放。绑定库为我处理了大部分线程控制,这很好(以及我在其中寻找的内容)。

现在,我还没有完全掌握这个概念,所以我很想得到一些参考。但我理解它的方式是,我必须基本上通知应用程序它可以使用多个线程。

我从 gstreamer 网站上的 examples 收集到这个,他们使用这个调用:

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

根据here,这告诉应用它可以使用多个线程(或多或少),这就是我上述假设的来源。

这就是背景。现在得到这个。我已将这些行放在我的代码中,它们工作正常。我的应用程序播放音乐而不是在尝试时崩溃。但是感觉有些不对劲。
在我得到这些行的示例中,他们对整个 GUI 使用 gtk,但我想使用 wxWidgets,所以调用这个 gtk 函数来执行此操作感觉不对。

有与此等效的 wx 吗? 还是可以使用它,它仍然可以跨平台工作吗?

另外,我必须弄清楚如何在退出时杀死所有这些线程(它现在不这样做)我在示例中再次使用 gtk 方法看到它们是如何做到的,所以再次寻找 wx 等价物.

PS:我认为这(或解决方案)可能与 wx.App.MainLoop() 函数有关,但我在试图理解这个循环的工作原理时迷失了方向,所以再次感谢有关此的良好参考,但我想只要我有一个好的解决方案就没有必要。

【问题讨论】:

    标签: multithreading wxpython


    【解决方案1】:

    尝试改用这个:

    import gobject
    gobject.threads_init()
    

    我想知道为什么它不是在每个 python gstreamer 插件文档的开头都用大字体写的:我只花了几个小时才找到它。

    更多细节here

    【讨论】:

    • 我想这可以解决这个问题。它有点暗示如果我使用 gtk 方法或 gobject 方法没有区别。但是哦,好吧。
    【解决方案2】:

    我没有使用 pyGST 的经验,但使用线程和 wxPython 的一般建议是只从主线程(即启动 MainLoop 的线程)更新 GUI。请参阅http://wiki.wxpython.org/LongRunningTasks 了解更多信息。

    【讨论】:

    • 是的,这就是我在 MainLoop 上的曲目。我只需要对 pyGST 事件等进行一些挖掘。如果它成功了,我一定会给你这个。谢谢,很高兴有人终于给出了答案。
    【解决方案3】:

    我没有使用 python 绑定的经验,但我在 Windows 上成功使用了 wxWidgets 和 GStreamer。问题是 wxWidgets 运行 Windows 事件循环,而 GStreamer 使用 GLib 事件循环。如果您不关心任何 GStreamer 事件,则无需执行任何操作。但是,如果您希望接收任何 GStreamer 事件,则必须在具有单独 GMainContext 的单独线程中运行您自己的 GLib 事件循环 (GMainLoop)。使用 gst_bus_create_watch 创建 GST 事件源,使用 g_source_set_callback 添加回调到源,然后使用 g_source_attach 将其附加到 GLib 事件循环的主上下文。然后您可以在回调中处理 GST,例如,将事件转发到 wx 主事件循环。

    【讨论】:

    • 我喜欢不必做任何事情的想法,而且我并不真正“关心”这些事件。但我的问题是,每当我尝试使用 GStreamer 开始播放(“playbin.set_state(gst.STATE_PLAYING)”)时,只要该方法(即设置状态)处于活动状态,它就会播放,这意味着 GUI 可以在播放时不做任何其他事情,我必须插入类似空循环的东西,只是为了让方法保持活动状态才能听到一些东西(我花了很长时间才发现这是我的问题)。否则该方法在我听到窥视之前返回。 :s
    • 真的吗? set_state 对我使用的任何 GStreamer 元素一直是非阻塞的。您是否从 GUI 线程调用 gtk.main() ,因为这会阻塞。如果 set_state 确实是阻塞的,你可以继承 wxThread 并重写 Entry 方法来调用 set_state。然后,从 GUI 执行 thread.Create(),然后执行 thread.Run() 来启动线程。希望这会有所帮助。
    • 我在调用 gtk.main() 时没有这个问题(连同 gtk.thread_init()) 但是就像我上面说的,我不喜欢专门使用 gtk 的想法,我想要它无需调用即可实现非阻塞,并坚持使用 wx API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2017-04-24
    相关资源
    最近更新 更多