これには、あなたの側でもう少しコーディングが必要になります。
私はPythonをよく知りませんが、あなたのコードを見ると、あなたが犯している間違いの1つは、PhononThread
クラスが独自のスレッドに住んでいると仮定することだと思いますが、実際にはそれが作成されたスレッドに住んでいます。
MediaObject
スレッド間のようにオブジェクトを移動しようとさえしません。それを行う 1 つの方法は、独自のQObject
子孫を作成し、そのコンストラクターで、音楽を再生するために必要なすべてのオブジェクトを作成することです。また、メイン スレッドから呼び出す必要があるすべてのフォノン関数にアクセスするために、クラスにスロットを追加する必要があります。親オブジェクトなしでこのオブジェクトを作成することを忘れないでください。次に、新しく作成された QThread に移動し、すべてのシグナル/スロットをスレッド間で接続する必要があります。
私は python を使用しませんが、これがどのように見えるべきかについての疑似 C++ の概要を以下に示します。
class MyPlayer: public QObject{
Q_OBJECT
public:
AudioOutput* ao;
MediaObject* mo;
MyPlayer() : QObject(0) { // note no parent QObject instance
ao = new AudioOutput();
... // Create and connect all objects
}
public slots:
void setCurrentSource ( const MediaSource & source ){
mo->setCurrentSource(source);
}
// And other methods that are not slots already.
};
次に、アプリケーションで次のことを行います。
MyPlayer* mp = new MyPlayer();
QThread* th = new QThread();
connect(th, SIGNAL(finished()), mp, SLOT(deleteLater()));
connect( mainThreadObj, SIGNAL(setPlayerSource ( const MediaSource & ) ), mp, SLOT(setPlayerSource ( const MediaSource & ) ) );
... // and other signals; note that methods that are signals already can be conected witout wrappers:
connect( mainThreadObj, SIGNAL(playerPlay() ), mp->mo, SLOT(play()) );
mp->moveToThread(th);
スレッドを停止するには、メインスレッドからのシグナルをquit()
スロットに接続し、必要に応じて送信します。