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";
相关推荐
组合缺一7 小时前
SolonCode CLI 为什么选择 Java 技术栈?
java·开发语言
czxyvX7 小时前
2-Qt信号与槽
c++·qt
熊猫钓鱼>_>8 小时前
GenUI:从“文本对话”到“可操作界面”的范式转移
开发语言·人工智能·agent·sdk·vibecoding·assistant·genui
Ulyanov8 小时前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio环境搭建与核心工作区详解
开发语言·python·qt·系统仿真·雷达电子战系统仿真
前端摸鱼匠8 小时前
【AI大模型春招面试题22】层归一化(Layer Norm)与批归一化(Batch Norm)的区别?为何大模型更倾向于使用Layer Norm?
开发语言·人工智能·面试·求职招聘·batch
历程里程碑8 小时前
MySQL视图:虚拟表的实战技巧
java·开发语言·数据库·c++·sql·mysql·adb
我在人间贩卖青春8 小时前
Qt 信号与槽的 5 种连接方式
qt·信号槽
lsx2024068 小时前
Go 语言循环语句
开发语言
逻辑驱动的ken8 小时前
Java高频面试考点场景题10
java·开发语言·深度学习·求职招聘·春招
曾几何时`8 小时前
QT——对象树
开发语言·qt