2012-12-04 2 views
2

비디오 플레이어를 사용하고 있지만 특정 시간 간격으로 프레임이 표시되는 "재생"기능을 구현하는 데 문제가 있습니다.QThread에서 루프로 신호를 내보내는 중

단추 또는 슬라이더를 사용하여 프레임을 스킵하는 것은 정상적으로 작동하지만 다음 코드는 제대로 작동하지 않습니다. 또한 그것은 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))); 

그래서 해당 프레임을 표시 않습니다 실제로 슬라이더를 이동.

답변

0

글쎄요, 물론 그런 일이 일어나고 있습니다 ... 당신은 루프가 끝날 때까지 메시지 펌프를 제어하지 못하는 GUI 쓰레드에 단단히 묶여 있습니다! :-)

updateFrame() 이후에 위젯에서 일종의 업데이트 기능을 동 기적으로 호출 할 수 있으며 재생을 볼 수는 있지만 GUI는 계속 w.r.t. 동결됩니다. 버튼 (예 : '일시 중지')을 누를 수 있습니다. GUI를 스레드가 프레임 사이의 메시지 펌프를 실행할 수 있도록

대신 타이머를 사용하는 것이 좋습니다 :

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

+0

은'Player' 객체가 나의 이해는'방출 것입니다, 별도의 스레드에서 실행 colorFrameEvent'를 33ms마다, GUI 스레드 간에는 원하는대로 자유롭게 할 수 있습니다. 왜 그런 일이 일어나지 않는지 조금 더 설명해 주시겠습니까? – jaho

+0

질문에 답을 시작한 이후로 질문을 편집했습니다. :) UI가 잠겨 있다면 GUI 펌프가 실행되고 있지 않다는 의미입니다. 당신은'Player :: play'가 GUI 스레드에서 실행되지 않는다고 확신합니까? [스레드 유사성] (http://doc.qt.digia.com/qt/qobject.html#moveToThread)이 맞는지 확인 했습니까? 작업중인 스레드 ID를 인쇄하여 원하는 스레드에서 실행 중인지 확인하십시오. – HostileFork

+1

물론, 당신 말이 맞았습니다. 분명히'Player :: run()'메소드 안에있는 것들은 별도의 스레드에서 실행됩니다. 나는 Player :: start()를 호출 한 후 객체가 스레드에 앉아서 GUI 스레드의 신호를 기다릴 것이라고 상상했다. 그래서 이제는 다른 스레드 (timer- like), 어떻게'on_btnPlay_clicked()'가 GUI에서 나오면'Player :: play()'슬롯이 별도의 스레드에서 실행되도록 할 수 있습니까? 많은 감사합니다. – jaho

관련 문제