当前位置: 首页> 教育> 幼教 > 西安疫情_摄影公司网站_网上营销怎么做_求几个微信推广平台

西安疫情_摄影公司网站_网上营销怎么做_求几个微信推广平台

时间:2025/7/10 8:56:53来源:https://blog.csdn.net/weixin_50873490/article/details/144242665 浏览次数:0次
西安疫情_摄影公司网站_网上营销怎么做_求几个微信推广平台

环境情况:使用的是thread c++11线程和qt的定时器

报错:

QObject::~QObject: Timers cannot be stopped from another thread

主要原因:

1.开启了一个事件循环线程处理消息类型,但是有一种消息类型需要关闭资源,这就导致当前线程调用xxxapi,把自己的资源关闭了,但是函数还没执行完。

2.stop同时涉及到定时器关闭,导致直接程序崩溃

std::shared_ptr<IjkMediaPlayer> mp = this->mp_;
while{switch(xxx){
case FFP_MSG_NETWORK_URL_ERROR:
emit sig_showTips(Toast::ERROR, (char *)msg.obj);
stop();  //关闭all 资源 ,涉及到当前位置mp,定时器。  bug所在
break;
}
if (msg.obj)msg.free_l(msg.obj);}mp.reset();
LOG(DEBUG) << "message_loop leave";

解决方案 

原理:在子线程中使用 QMetaObject::invokeMethod() 函数来间接地停止定时器。这种方式可以将停止定时器的操作切换回主线程执行。也就是说资源释放是主线程干的。就不会阻塞调用stop!

QMetaObject::invokeMethod(this, "stop", Qt::QueuedConnection);
std::shared_ptr<IjkMediaPlayer> mp = this->mp_;
while{switch(xxx){
case FFP_MSG_NETWORK_URL_ERROR:
emit sig_showTips(Toast::ERROR, (char *)msg.obj);
//实现子线程关闭定时器
QMetaObject::invokeMethod(this, "stop", Qt::QueuedConnection);
break;
}
if (msg.obj)msg.free_l(msg.obj);}mp.reset();
LOG(DEBUG) << "message_loop leave";

关键字:西安疫情_摄影公司网站_网上营销怎么做_求几个微信推广平台

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: