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. 注意观察,总结什么情况下报错
1 2 3 4 5 6 7 8 9 10 | 一秒一条消息进来 10秒刷新一次,10分钟都没有异常 5秒刷新一次,10分钟都没有异常 2秒刷新一次,10分钟都没有异常===>13分钟崩溃 1秒刷新一次,6分钟后有问题 一秒四条消息进来 2秒刷新一次,第4分钟出现异常 5秒刷新一次,第4分钟出现异常 10秒刷新一次,第4分钟出现异常 |
3. 在不确定什么缘由导致时,注释整块、部分代码去排除出问题的代码
出问题的代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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(); } |
结合网上资料
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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等复用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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(); } } |
博客地址:https://blog.csdn.net/xiang__liu,https://www.cnblogs.com/xiang--liu/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决