Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从其他线程播放QMediaPlayer_C++_Multithreading_Qt_Qmediaplayer - Fatal编程技术网

C++ 无法从其他线程播放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

我想知道为什么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


由于您实例化了
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;
}