2009-05-02 23 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