2009-05-02 6 views
0

OK、私はpyGSTバインディングで音楽を​​再生するアプリを書いています。wxのpythonアプリケーションのスレッドとpyGSTを使用

再生を処理するには、スレッドを使用する必要があります。バインディングライブラリは、私のためのスレッドコントロールのほとんどを処理します。これは素晴らしい(そして私が探していたものです)。

今、私はこのコンセプトを十分に理解していないので、いくつかの参考文献を熱望しています。しかし、私がそれを理解する方法は、基本的にそれが複数のスレッドを使用できることをアプリに通知する必要があるということです。

私は、彼らがこのコールを使用しgstreamerのサイト上でexamplesからこれを収集:hereに応じ

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

、これはそれが複数のスレッド(多かれ少なかれ)を、使用することができるアプリを伝えます私の上記の仮定はから来た。

これは背景です。今これを入手してください。私はそれらの行を自分のコードに入れて、うまく動作します。私のアプリは、試してみるたびにクラッシュするのではなく、音楽を再生します。しかし、何かが正しく感じられません。
これらの行を取得した例では、GUI全体でgtkを使用していますが、wxWidgetsを使用したいので、gtk関数を呼び出すのが間違っていると感じます。

これに相当するwxはありますか?またはこれを使用しても問題ないですが、それでもクロスプラットフォームで動作しますか?

また、これらのスレッドを終了時にすべて終了させる方法を理解しておく必要があります(これは現在ではありません)。gtkメソッドを使用した例では、同等。

PS:これは、wx.App.MainLoop()関数に関連している可能性がありますが、このループの仕組みを理解しようとすると失われてしまいます。私は良い解決策を持っている限り、私は必要ではないと思います。

答えて

1

ではなく、これを使用してみてください:

import gobject 
gobject.threads_init() 

私はそれがドキュメントのすべてのパイソンのGStreamerプラグインピースの開始時に大きな活字で書かれていませんどのように来るだろう:それだけでそれを見つけるために私に数時間を要しました。

ビット詳細here

+0

私はそれを解決すると思います。 gtkメソッドまたはgobjectメソッドを使用すると違いはないことを意味します。しかしまあまあ。 – gnomed

0

pyGSTの経験はありませんが、スレッドとwxPythonの使用に関する一般的なアドバイスは、メインスレッド(つまりMainLoopを開始するスレッド)からGUIを更新することだけです。詳細については、http://wiki.wxpython.org/LongRunningTasksを参照してください。

+0

ええ、これは私がMainLoopで行ったトラックのようなものです。私はちょうどpyGSTのイベントなどを推測しています。それがうまくいくなら、私はあなたにこの1つを必ず渡すでしょう。ありがとう、おかげで、誰かがついに答えて喜んでくれました。 – gnomed

0

私はpythonバインディングに関する経験はありませんが、Windows上でwxWidgetsとGStreamerを一緒に使って成功しました。問題は、GStreamerがGLibイベントループを使用しているときにwxWidgetsがWindowsイベントループを実行することです。 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))ことを試みるたびに、そのメソッド(状態を設定している)がアクティブな間だけ再生され、その演奏中は何もしないで、何かを聞くためにメソッドをアクティブに保つために空のループのようなものを挿入しなければならないでしょう(これは私の問題だったと私は永遠に思いました)。さもなければ、私は覗き見を聞く前にメソッドを返します。 :s – gnomed

+0

本当ですか? set_stateは、私が使用しているGStreamer要素のいずれかで常に非ブロック化されています。 gtk.main()をGUIスレッドから呼び出すのはブロックされるためです。 set_stateが実際にブロックしている場合、wxThreadをサブクラス化して、Entryメソッドをオーバーライドしてset_stateを呼び出すことができます。その後、GUIからthread.Create()の後にthread.Run()を実行してスレッドを開始します。お役に立てれば。 –

+0

gtk.main()(gtk.thread_init()と一緒に)を呼び出すとこの問題はありません。しかし、上記のように、gtkを使用するというアイデアは特にありません。これを呼び出し、wx APIに固執します。 – gnomed

関連する問題