2

私は一種のビデオプレーヤーに取り組んでいますが、特定の時間間隔でフレームが表示される「再生」機能の実装に問題があります。

ボタンまたはスライダーを使用したフレームのスキップは正常に機能しますが、次のコードは機能しません。さらに、GUI スレッドをブロックしているようで、最後のフレームのみを表示します。

void Player::play()
{
    for(int i = currentFrame_; i < replay_->getHeader().numberOfFrames; ++i)
    {
        setFrame(i);    // load and send frame i
        msleep(33);     // wait 33 ms
    }
}

void Player::setFrame(int frameNumber)
{
    currentFrame_ = frameNumber;
    replay_->setCurrentFrame(currentFrame_);    // load currentFrame into buffer
    updateFrame();                              // send it to the GUI to be shown
}

void Player::updateFrame()
{
    ReplayFrame colorFrame;

    colorFrame = replay_->getColorFrame();
    emit colorFrameEvent(static_cast<unsigned char *>(colorFrame.getData()));    // this is connected to MainWindow::showFrame(unsigned char *)
}

次のコードは正常に機能することに注意してください。

// In main window, called upon loading a replay
QObject::connect(ui->sliderFrames, SIGNAL(valueChanged(int)), kp, SLOT(setFrame(int)));

したがって、スライダーを動かすと、実際には対応するフレームが表示されます。

4

1 に答える 1

0

もちろん、それは起こっています...ループが終了するまでメッセージポンプに制御を渡さないGUIスレッドのタイトなループに陥っています! :-)

後にウィジェットである種の更新関数を同期的に呼び出すことができる場合がありupdateFrame()、再生を見ることができます...しかし、GUIは、押したいボタン(「一時停止」など)のためにまだフリーズしています。

GUI スレッドがフレーム間でメッセージ ポンプを実行できるように、代わりにタイマーを使用することを検討してください。

http://doc.qt.digia.com/qt/qtimer.html

于 2012-12-04T20:43:20.673 に答える