0

Phonon.MediaObject介して Web ソースに接続されている がありますPhonon.AudioOutput。そのため、 を実行play()すると、プレイヤーがプレイを開始するまでメイン GUI がフリーズします (最悪の場合 5 秒)。

これは、プレーヤーを移動するか、少なくとも Web フェッチ タスクによって修正できます。機能についてオンラインで読みましmoveToThread()たが、機能していないようです。

私はそれからスレッドを作成しようとしましたが、運が悪かった: http://pastebin.com/1iXdQD8Y (PyQt で書かれた)

何か案は?

4

3 に答える 3

1

これには、あなたの側でもう少しコーディングが必要になります。

私は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()スロットに接続し、必要に応じて送信します。

于 2013-03-05T00:27:13.450 に答える
0

試しましたQtConcurrent::runか?別のスレッドで機能を実行します。

http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html#run またはここで確認してください https://stackoverflow.com/search?q=QtConcurrent%3A%3Arun

于 2013-03-04T12:25:14.980 に答える
0

をサブクラス化し、スレッドで発生させたいことをQThread再実装してから、スレッドのインスタンスを作成して呼び出します。run()start()

スレッド内またはスレッドから接続するときは注意してください。ほとんどの場合、直接または自動接続を実行したくないため、キュー接続を実行する必要があります。

このリンクはQThread、 を使用する 2 つの方法を示しています。1 つは先ほど説明した方法であり、 を使用した別の生産者と消費者の例にリンクしていますmoveToThread()

QThreadを実装する正しい方法は何ですか...(例をお願いします...)

それが役立つことを願っています。

于 2013-02-22T23:13:18.850 に答える