添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
高大的感冒药  ·  Qt QPixmap, ...·  2 年前    · 
踢足球的剪刀  ·  Qt for ...·  2 年前    · 
含蓄的消炎药  ·  Dcat ...·  2 年前    · 

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 表示程序分配内存异常。

QPainter::begin: Paint device returned engine == 0, type: 3_初始化

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();
}
}