• QPainter::begin: Paint device returned engine == 0, type: 3


    1. 当页面消息比较多时候,会报错

    QPainter::begin: Paint device returned engine == 0, type: 3
    QPainter::setCompositionMode: Painter not active
    QPainter::end: Painter not active, aborted
    QPainter::begin: Paint device returned engine == 0, type: 3
    QPainter::scale: Painter not active
    QPainter::setRenderHint: Painter must be active to set rendering hints
    QPainter::end: Painter not active, aborted
    QPainter::begin: Paint device returned engine == 0, type: 3
    QPainter::setCompositionMode: Painter not active
    QPainter::end: Painter not active, aborted
    
    
    QThread::start: Failed to create thread (Unknown error 0x00000022.)
    ==========> ExitInstance :gLayerInfo delete 113286984<==============Unload CSProxy from Client.exe...
    terminate called after throwing an instance of 'std::bad_alloc'
      what():  std::bad_alloc

    2. 注意观察,总结什么情况下报错

    一秒一条消息进来
    10秒刷新一次,10分钟都没有异常
    5秒刷新一次,10分钟都没有异常
    2秒刷新一次,10分钟都没有异常===>13分钟崩溃
    1秒刷新一次,6分钟后有问题
    
    一秒四条消息进来
    2秒刷新一次,第4分钟出现异常
    5秒刷新一次,第4分钟出现异常
    10秒刷新一次,第4分钟出现异常
    

    3. 在不确定什么缘由导致时,注释整块、部分代码去排除出问题的代码

    出问题的代码如下

        if(!soundName.isEmpty()){
            QMediaPlayer    *player = new QMediaPlayer();;//播放器
            QMediaPlaylist  *playlist = new QMediaPlaylist();//播放列表
            player->setPlaylist(playlist);
    
            if (player->state()!=QMediaPlayer::PlayingState){
                playlist->setCurrentIndex(0);
            }
            playlist->setPlaybackMode(QMediaPlaylist::Sequential); //循环模式
    
            QString audiosPath = QCoreApplication::applicationDirPath() + "/audios/";
    
            playlist->clear();
            //放3遍
            playlist->addMedia(QUrl::fromLocalFile(audiosPath+soundName+".mp3"));
            playlist->addMedia(QUrl::fromLocalFile(audiosPath+soundName+".mp3"));
            playlist->addMedia(QUrl::fromLocalFile(audiosPath+soundName+".mp3"));
            player->play();
        }
    

     结合网上资料

    class Q_CORE_EXPORT QInternal {
    public:
        enum PaintDeviceFlags {
            UnknownDevice = 0x00,
            Widget        = 0x01,
            Pixmap        = 0x02,
            Image         = 0x03,
            Printer       = 0x04,
            Picture       = 0x05,
            Pbuffer       = 0x06,    // GL pbuffer
            FramebufferObject = 0x07, // GL framebuffer object
            CustomRaster  = 0x08,
            MacQuartz     = 0x09,
            PaintBuffer   = 0x0a,
            OpenGL        = 0x0b
        };
    

    QPainter::begin: Paint device returned engine == 0, type: 3

    UnknownDevice==>

    每条消息会初始化QMediaPlayer,多个QMediaPlayer;播放会造成设备UnknownDevice;并且std::bad_alloc 表示程序分配内存异常。

    4.解决方法

    使用QMutex mutex,lock()、unlock()对上述代码块加锁,并对QMediaPlayer等复用。

    static QMutex mutex;
    static QMediaPlayer    *player = new QMediaPlayer();//播放器
    static QMediaPlaylist  *playlist = new QMediaPlaylist();//播放列表
    
    
    void XXX::playSound(QString soundName){
        if(!soundName.isEmpty()){
            mutex.lock();
    
            qDebug() << "【AlarmMessage::playSound】 start " << soundName;
            player->setPlaylist(playlist);
    
            if (player->state()!=QMediaPlayer::PlayingState){
                playlist->setCurrentIndex(0);
            }
            playlist->setPlaybackMode(QMediaPlaylist::Sequential); //循环模式
    
            QString audiosPath = QCoreApplication::applicationDirPath() + "/audios/";
    
            playlist->clear();
            //放3遍
            playlist->addMedia(QUrl::fromLocalFile(audiosPath+soundName+".mp3"));
            playlist->addMedia(QUrl::fromLocalFile(audiosPath+soundName+".mp3"));
            playlist->addMedia(QUrl::fromLocalFile(audiosPath+soundName+".mp3"));
            player->play();
    
            qDebug() << "【AlarmMessage::playSound】 end " << soundName;
    
            mutex.unlock();
        }
    }
    
  • 相关阅读:
    SSH 多台VM之间无密码登录
    JavaScript Calling WebService by SOAP
    Excel大数据排查重复行内容方法,三步搞定!
    linux添加软件的service start/stop快捷服务(简单版)
    Linux服务器其中一个磁盘满了怎么办?在不做磁盘扩容的情况下,一个软连接就搞定。
    oracle数据库中将clob字段内容利用java提取出至文本文档中
    最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
    mysql数据库误删除操作说明
    mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!
    新建ftp账号,并使登陆者只访问当前目录
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/14272528.html
Copyright © 2020-2023  润新知