gpt4 book ai didi

c++ - 无法从不同的线程播放 QMediaPlayer

转载 作者:行者123 更新时间:2023-11-28 04:36:29 28 4
gpt4 key购买 nike

我想知道为什么 QMediaPlayer 不是从另一个线程播放,而是在调用者线程停止时开始播放。

例如:

线程 A 调用(调用由信号槽完成)到线程 B 开始播放 MP3,但线程 A 继续他的工作,但是线程B虽然收到了播放命令,但还是没有播放,但是当我停止线程A时,播放器就开始播放了。所以线程A和B不能同时运行。

为什么会这样,这两个线程之间没有任何关系,只是一个简单的信号给线程B开始播放。

代码:标题

class Alarm : public QObject
{
Q_OBJECT
public:
Alarm();
~Alarm();

signals:
void play();
void stop();

private:
QMediaPlayer *player;
QThread alarmThread;
};

.cpp

Alarm::Alarm() : QObject()
{
player = new QMediaPlayer;
player->setMedia(QUrl("qrc:/media/alarm_music.mp3"));
player->setVolume(80);
connect(this, &Alarm::play, this, [this]() {
if(player->state() == QMediaPlayer::PlayingState) {
return;
}
player->play();
});
connect(this, &Alarm::stop, player, &QMediaPlayer::stop);

moveToThread(&alarmThread);
alarmThread.start();
}

Alarm::~Alarm()
{
alarmThread.quit();
alarmThread.wait();
delete player;
}

最佳答案

由于您实例化了 QMediaPlayer 而没有设置其父级,它继续“存在”在构造 Alarm 对象的线程中。如果该线程没有事件循环,QMediaPlayer 将无法正常运行。

此外,从未绑定(bind) QMediaPlayer 的线程调用 start/stop 是不安全的。

另外,通过值构造一个QObject也是合法的;您不必使用 new 来实例化每个 QObject

关于c++ - 无法从不同的线程播放 QMediaPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266764/

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