C++ 无法从其他线程播放QMediaPlayer
我想知道为什么QMediaPlayer没有从另一个线程播放,但是它在调用线程停止时开始播放 例如: 线程C++ 无法从其他线程播放QMediaPlayer,c++,multithreading,qt,qmediaplayer,C++,Multithreading,Qt,Qmediaplayer,我想知道为什么QMediaPlayer没有从另一个线程播放,但是它在调用线程停止时开始播放 例如: 线程A调用(通过信号槽调用)线程B开始播放MP3,但是线程A继续他的工作,但是线程B虽然接收到播放命令,但仍然不播放,但是当我停止线程A时,播放器开始播放。因此线程A和线程B不能同时运行 为什么是这样,这两个线程之间没有任何关系,只是一个简单的信号到线程B开始播放 代码:标题 class Alarm : public QObject { Q_OBJECT public: Alarm
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
由于您实例化了
QMediaPlayer
,而没有设置其父对象,因此它将继续在构建Alarm
对象的线程中“活动”。如果该线程没有事件循环,QMediaPlayer
将无法正常工作
另外,从QMediaPlayer
未绑定的线程调用start
/stop
是不安全的
此外,根据值构造
QObject
也是合法的;您不必使用new
来实例化每个QObject
发布一个最小但完整的代码示例。@Navie我已经详细说明了如果您理解,您知道代码可能是什么。@Navie它不属于代码,代码没有错误,它属于API,代码工作正常,播放声音,但问题是,当试图从另一个线程调用播放信号时,它没有播放。@BahramdunAdil您是否使用QMediaPlayer旁边的任何小部件?
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;
}