qt环境 C11thread子线程关闭定时器问题

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

报错:

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

主要原因:

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

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

cpp 复制代码
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!

cpp 复制代码
QMetaObject::invokeMethod(this, "stop", Qt::QueuedConnection);
cpp 复制代码
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";
相关推荐
Lhan.zzZ30 分钟前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
打工仔折腾 AI1 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问2 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want5952 小时前
Python跳动的爱心②
开发语言·python·数学建模
小羊没烦恼!3 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
爱吃香菜的初学者3 小时前
十六.Linux——多线程(2)
linux·运维·开发语言
jeo陽3 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
暖核3 小时前
kubeadm 集群运维:Worker 节点下线删除、整套集群销毁重建指南
运维·开发语言·php
tachibana24 小时前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者4 小时前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言