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";
相关推荐
Zsy_0510033 分钟前
【C++】类和对象(二)
开发语言·c++
Duang007_8 分钟前
【万字学习总结】API设计与接口开发实战指南
开发语言·javascript·人工智能·python·学习
一叶星殇11 分钟前
C# .NET 如何解决跨域(CORS)
开发语言·前端·c#·.net
Elieal11 分钟前
Java项目密码加密实现详解
java·开发语言
shhpeng13 分钟前
go mod vendor命令详解
开发语言·后端·golang
Java程序员威哥13 分钟前
用Java玩转机器学习:协同过滤算法实战(比Python快3倍的工程实现)
java·开发语言·后端·python·算法·spring·机器学习
GeekyGuru15 分钟前
C++跨平台开发的核心挑战与应对策略
开发语言·c++
Howrun77721 分钟前
信号量(Semaphore)
开发语言·c++·算法
leaves falling21 分钟前
c语言-动态内存管理
c语言·开发语言
Lution Young22 分钟前
Qt隐式共享产生的问题
开发语言·qt