您的位置:首页 > 房产 > 建筑 > 做网站开发的流程_北京冬奥会网页设计_搜索引擎有哪些软件_n127网推广

做网站开发的流程_北京冬奥会网页设计_搜索引擎有哪些软件_n127网推广

2024/12/23 10:13:45 来源:https://blog.csdn.net/weixin_50873490/article/details/144242665  浏览:    关键词:做网站开发的流程_北京冬奥会网页设计_搜索引擎有哪些软件_n127网推广
做网站开发的流程_北京冬奥会网页设计_搜索引擎有哪些软件_n127网推广

环境情况:使用的是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