Излучение сигналов в цикле от QThread

Я работаю над видеоплеером, но у меня проблема с реализацией функции «Воспроизведение», когда кадры отображаются через определенный промежуток времени.

Пропуск кадров с помощью кнопок или ползунка работает нормально, но следующий код не работает. Более того, он блокирует поток графического интерфейса и отображает только последний кадр.

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)));

Таким образом, перемещение ползунка действительно отображает соответствующий кадр.

2

Решение

Ну, конечно, это происходит … вы находитесь в тесном цикле в потоке GUI, который никогда не передаст управление насосу сообщений, пока цикл не закончится! 🙂

Может быть возможно синхронно вызвать некоторую функцию обновления в вашем виджете после updateFrame(), и вы можете смотреть воспроизведение … но графический интерфейс все равно будет заморожен w.r.t. кнопки, которые вы можете нажать (например, «пауза»).

Попробуйте вместо этого использовать таймер, чтобы поток графического интерфейса мог запускать рассылку сообщений между кадрами:

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]