gpt4 book ai didi

c++ - 从 QThread 循环发射信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:36 24 4
gpt4 key购买 nike

我正在开发一种视频播放器,但我在实现“播放”功能时遇到问题,其中帧以特定时间间隔显示。

使用按钮或 slider 跳过帧可以正常工作,但以下代码不能。此外,它似乎阻塞了 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)));

所以移动 slider 实际上确实显示了相应的帧。

最佳答案

好吧,这当然正在发生......您在 GUI 线程上处于一个紧密循环中,在循环结束之前永远不会让出对消息泵的控制! :-)

updateFrame() 之后可能会在您的小部件上同步调用某种更新函数,并且您可以观看回放...但是 GUI 仍然会卡住 w.r.t.您可能想要按下的按钮(例如“暂停”)

考虑改用计时器,这样 GUI 线程就可以在帧之间运行消息泵:

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

关于c++ - 从 QThread 循环发射信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com