2009-05-02 45 views
0

好的,所以我正在编写一个应用程序,该应用程序使用pyGST绑定播放音乐。在wx python应用程序中使用线程和pyGST

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

现在,我对这个概念并没有完全的把握,所以我会渴望一些参考。但是我理解它的方式是,我必须通知应用程序它可以使用多个线程。

我对GStreamer的网站,在那里他们用这个电话收集了这些从examples

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

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

这是背景。现在得到这个。我已将这些行放在我的代码中,并且它们工作正常。每次尝试时,我的应用都会播放音乐而不是崩溃。但有些事情感觉不对。
在我得到这些代码的例子中,他们使用gtk作为整个GUI,但是我想使用wxWidgets,因此调用这个gtk函数来做这件事感觉不对。

是否有与此相当的wx?还是可以使用这个,它会继续工作跨平台吗?另外,我必须弄清楚如何在退出时清除所有这些线程(它现在不这样做),我再次看到它们在使用gtk方法的例子中是如何实现的,所以再次寻找一个wx当量。 PS:我认为这个(或者解决方案)可能与wx.App.MainLoop()函数有关,但是我在试图理解这个循环是如何工作的时候会迷失方向,所以关于它的好的参考将会是赞赏,但我认为没有必要,只要我有一个好的解决方案。

回答

1

尝试使用这个:

import gobject 
gobject.threads_init() 

我不知道怎么就不能在文档的每个Python的GStreamer插件一块开始写的大字:只花了好几个小时找到它。

更多详情here

0

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

+0

是的,这是我与MainLoop的轨道。我只需要为pyGST事件等进行挖掘。如果能解决问题,我一定会给你这个答复。谢谢,很高兴有人终于给了一个答案。 – gnomed 2009-05-05 01:25:29

0

我没有使用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主事件循环。

+0

我喜欢不必做任何事情的想法,而且我并不真正“关心”事件。但我的问题是,每当我尝试用GStreamer开始播放(“playbin.set_state(gst.STATE_PLAYING)”)时,它只会在该方法(即设置状态)处于活动状态时才播放,这意味着GUI可以'在播放时不要做任何事情,而且我必须插入一些像空循环一样的东西,以保持方法处于活动状态以听取某些内容(我永远花了我的时间才发现这是我的问题)。否则该方法在我听到窥视之前返回。 :s – gnomed 2009-05-06 02:06:50

+0

真的吗? set_state一直使用我已经使用的任何GStreamer元素都是非阻塞的。你是否从GUI线程调用gtk.main(),因为它会阻塞。如果set_state实际上是阻塞的,那么可以继承wxThread并重写Entry方法来调用set_state。然后,从GUI开始,执行一个thread.Create(),接着执行thread.Run()以启动该线程。希望这可以帮助。 – 2009-05-06 11:59:32