비디오 플레이어를 사용하고 있지만 특정 시간 간격으로 프레임이 표시되는 "재생"기능을 구현하는 데 문제가 있습니다.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)));
그래서 해당 프레임을 표시 않습니다 실제로 슬라이더를 이동.
은'Player' 객체가 나의 이해는'방출 것입니다, 별도의 스레드에서 실행 colorFrameEvent'를 33ms마다, GUI 스레드 간에는 원하는대로 자유롭게 할 수 있습니다. 왜 그런 일이 일어나지 않는지 조금 더 설명해 주시겠습니까? – jaho
질문에 답을 시작한 이후로 질문을 편집했습니다. :) UI가 잠겨 있다면 GUI 펌프가 실행되고 있지 않다는 의미입니다. 당신은'Player :: play'가 GUI 스레드에서 실행되지 않는다고 확신합니까? [스레드 유사성] (http://doc.qt.digia.com/qt/qobject.html#moveToThread)이 맞는지 확인 했습니까? 작업중인 스레드 ID를 인쇄하여 원하는 스레드에서 실행 중인지 확인하십시오. – HostileFork
물론, 당신 말이 맞았습니다. 분명히'Player :: run()'메소드 안에있는 것들은 별도의 스레드에서 실행됩니다. 나는 Player :: start()를 호출 한 후 객체가 스레드에 앉아서 GUI 스레드의 신호를 기다릴 것이라고 상상했다. 그래서 이제는 다른 스레드 (timer- like), 어떻게'on_btnPlay_clicked()'가 GUI에서 나오면'Player :: play()'슬롯이 별도의 스레드에서 실행되도록 할 수 있습니까? 많은 감사합니다. – jaho