5、可暂停的线程控制模型
一、需求
在做播放器的时候,很多的模块会创建一个线程,然后在这个线程上跑单独的功能,同时,需要对这个线程进行控制,比如暂停,继续等,如播放器的解码,解封装等,都需要对对应的线程进行控制,那么为了方便的进行控制,所以引入单独的thread封装,并且导出对应的回调接口。
二、实现
1. com_thread.h
#pragma once#include <thread>
#include <atomic>class IThreadSink
{
public:virtual ~IThreadSink() {}virtual void onThreadCreate() = 0;virtual void onThreadDestroy() = 0;virtual void onThreadRun() = 0;virtual void onThreadPause() = 0;virtual void onThreadTask() = 0;
};class IThread
{typedef enum{STAT_WAIT,STAT_RUN,STAT_PAUSE,STAT_QUIT}ThreadStat;public:virtual ~IThread() {}IThread(IThreadSink* _sink);void threadCreate();void threadDestroy();void run();void pause();
private:std::atomic<int> _stat_cur;std::atomic<int> _stat_set;std::thread _thread;IThreadSink* _sink;bool _is_init;void _threadTaskInternal();void _setStat(ThreadStat stat);
};
2. com_thread.c
#include "com_thread.h"IThread::IThread(IThreadSink* sink):_stat_cur(STAT_WAIT),_stat_set(STAT_WAIT),_sink(NULL),_is_init(false)
{_sink = static_cast<IThreadSink*>(sink);
}void IThread::threadCreate()
{if (_is_init){return;}_thread = std::thread(&IThread::_threadTaskInternal, this);_is_init = true;
}
void IThread::threadDestroy()
{if (!_is_init){return;}_setStat(STAT_QUIT);_thread.join();_is_init = false;
}
void IThread::run()
{if (!_is_init){return;}if (_stat_cur == STAT_WAIT || _stat_cur == STAT_PAUSE){_setStat(STAT_RUN);if (_sink){_sink->onThreadRun();}}
}
void IThread::pause()
{if (!_is_init){return;}if (_stat_cur == STAT_RUN){_setStat(STAT_PAUSE);if (_sink){_sink->onThreadPause();}}
}void IThread::_threadTaskInternal()
{if (_sink){_sink->onThreadCreate();}while (1){if ((_stat_cur == STAT_WAIT || _stat_cur == STAT_PAUSE) && _stat_cur == _stat_set){std::this_thread::sleep_for(std::chrono::milliseconds(1));continue;}if (_stat_cur != _stat_set){_stat_cur = _stat_set.load();}if (STAT_QUIT == _stat_cur){break;}if (STAT_WAIT == _stat_cur || STAT_PAUSE == _stat_cur){continue;}if (STAT_RUN == _stat_cur){_sink->onThreadTask();}}if (_sink){_sink->onThreadDestroy();}
}
void IThread::_setStat(ThreadStat stat)
{_stat_set = stat;while (_stat_cur == stat){std::this_thread::sleep_for(std::chrono::milliseconds(1));}
}
3. demo.cpp
#include <iostream>
#include "com_thread.h"class ThreadTestDemo :public IThreadSink
{
public:virtual void onThreadCreate() override{std::cout << "Create" << std::endl;}virtual void onThreadDestroy() override{std::cout << "Destroy" << std::endl;}virtual void onThreadRun() override{std::cout << "Run" << std::endl;}virtual void onThreadPause() override{std::cout << "Pause" << std::endl;}virtual void onThreadTask() override{std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "do task!!!" << std::endl;}void test(){IThread* _thread = new IThread(this);_thread->threadCreate();std::this_thread::sleep_for(std::chrono::milliseconds(1000));for (int i = 0; i < 3; i++){_thread->run();std::this_thread::sleep_for(std::chrono::milliseconds(1000));_thread->pause();std::this_thread::sleep_for(std::chrono::milliseconds(2000));}_thread->threadDestroy();delete _thread;}
};
相关文章:
5、可暂停的线程控制模型
一、需求 在做播放器的时候,很多的模块会创建一个线程,然后在这个线程上跑单独的功能,同时,需要对这个线程进行控制,比如暂停,继续等,如播放器的解码,解封装等,都需要对…...
sql优化--mysql隐式转换
sql隐式转换 在SQL中,隐式转换是数据库自动进行的类型转换,隐式转换可以帮助我们处理不同类型的数据。 比如,数据表的字段是字符串类型的,传入一个整型的数据,也能够运行sql。 sql隐式转换的弊端 sql隐式转换&…...
Scratch021(画笔)
画笔模块 可以这么理解,画笔模块是Scratch的拓展模块,用它可以完成很多的功能,非常有趣! 案例要求 点击绿旗运行程序,页面显示需要绘制的背景。 可以使用鼠标移动画笔角色,按照顺序点击连线,…...
Leetcode 3387. Maximize Amount After Two Days of Conversions
Leetcode 3387. Maximize Amount After Two Days of Conversions 1. 解题思路2. 代码实现 题目链接:3387. Maximize Amount After Two Days of Conversions 1. 解题思路 这一题思路上其实就是要分别求出day 1以及day 2中原始货币与其他各个货币之间的成交价&…...
机器视觉与OpenCV--01篇
计算机眼中的图像 像素 像素是图像的基本单位,每个像素存储着图像的颜色、亮度或者其他特征,一张图片就是由若干个像素组成的。 RGB 在计算机中,RGB三种颜色被称为RGB三通道,且每个通道的取值都是0到255之间。 计算机中图像的…...
简单的Java小项目
学生选课系统 在控制台输入输出信息: 在eclipse上面的超级简单文件结构: Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…...
使用layui的table提示Could not parse as expression(踩坑记录)
踩坑记录 报错图如下 原因: 原来代码是下图这样 上下俩中括号都是连在一起的,可能导致解析问题 改成如下图这样 重新启动项目,运行正常!...
区块链共识机制详解
一.共识机制简介 在区块链的交流和学习中,「共识算法」是一个很频繁被提起的词汇,正是因为共识算法的存在,区块链的可信性才能被保证。 1.1 为什么需要共识机制? 所谓共识,就是多个人达成一致的意思。我们生活中充满…...
【Excel】单元格分列
目录 分列(新手友好) 1. 选中需要分列的单元格后,选择 【数据】选项卡下的【分列】功能。 2. 按照分列向导提示选择适合的分列方式。 3. 分好就是这个样子 智能分列(进阶) 高级分列 Tips: 新手推荐基…...
【含开题报告+文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现
开题报告 近年来,随着互联网技术的迅猛发展,人们的生活方式、消费习惯以及信息交流方式都发生了深刻的变化。旅游业作为国民经济的重要组成部分,其信息化、网络化的发展趋势也日益明显。旅游论坛作为旅游信息交流和分享的重要平台࿰…...
微软 Phi-4:小型模型的推理能力大突破
在人工智能领域,语言模型的发展日新月异。微软作为行业的重要参与者,一直致力于推动语言模型技术的进步。近日,微软推出了最新的小型语言模型 Phi-4,这款模型以其卓越的复杂推理能力和在数学领域的出色表现,引起了广泛…...
操作系统课后习题2.2节
操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度,这个是由CPU的设计和它的硬件来决定的,具体的调度算法是不能提高CPU的效率的; 第3题 互斥性: 指的是进程之间的同步互斥关系,进程是一个动态的过程&#…...
[小白系列]安装sentence-transformers
python环境为3.13.1执行 pip install sentence-transformers 总是报以下问题 ERROR: Cannot install sentence-transformers0.1.0, sentence-transformers0.2.0, sentence-transformers0.2.1, sentence-transformers0.2.2, sentence-transformers0.2.3, sentence-transformers…...
Python字符串format方法全面解析
在Python中,format方法是一种用于格式化字符串的强大工具。它允许你构建一个字符串,其中包含一些“占位符”,这些占位符将被format方法的参数替换。以下是对format方法用法的详细解释: 基本用法 format方法的基本语法如下&#…...
【Reading Notes】Favorite Articles from 2024
文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 2、February 3、March Sora外部测试翻车了!3个视频都有Bug( 2024年03月01日) 不仔细看还真看不…...
Python爬虫之Scrapy框架基础入门
Scrapy 是一个用于Python的开源网络爬虫框架,它为编写网络爬虫来抓取网站数据并提取结构化信息提供了一种高效的方法。Scrapy可以用于各种目的的数据抓取,如数据挖掘、监控和自动化测试等。 【1】安装 pip install scrapy安装成功如下所示:…...
spring cloud contract mq测试
对于spring cloud contract的环境配置和部署,请看我之前的文章。 一 生产者测试 测试生产者是否发送出消息,并测试消息内容是否正确。 编写测试合同 测试基类(ContractTestBase)上面要添加下面注解 SpringBootTest AutoConfig…...
Axure原型设计技巧与经验分享
AxureRP作为一款强大的原型设计工具,凭借其丰富的交互设计能力和高保真度的模拟效果,赢得了众多UI/UX设计师、产品经理及开发人员的青睐。本文将分享一些Axure原型设计的实用技巧与设计经验,帮助读者提升工作效率,打造更加流畅、用…...
计算机网络之王道考研读书笔记-1
第 1 章 计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络概念 internet(互连网):泛指由多个计算机网络互连而成的计算机网络。这些网络之间可使用任意通信协议。 Internet(互联网或因特网):指当前全球最大的、开放的、由众多网络和路由器互连…...
服务器限制某个端口只允许特定IP访问(处理第三方依赖漏洞)
最近项目部署之后,有些客户开始进行系统系统漏洞扫描,其中出现问题多的一个就是我们项目所依赖的Elasticsearch(es检索服务),很容易就被扫出来各种高危漏洞,而且这些漏洞我们在处理起来是很棘手的ÿ…...
终极Windows驱动清理指南:3分钟快速释放C盘隐藏空间
终极Windows驱动清理指南:3分钟快速释放C盘隐藏空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统越用越慢,C盘空间莫名其妙消失&#x…...
XUnity.AutoTranslator:打破游戏语言障碍的终极解决方案
XUnity.AutoTranslator:打破游戏语言障碍的终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏内容而苦恼吗?XUnity.AutoTranslator让语言障碍不再是问题&…...
【Perplexity阅读推荐查询实战指南】:20年AI工具专家亲授5大精准筛选技巧,错过再等一年
更多请点击: https://kaifayun.com 第一章:Perplexity阅读推荐查询的核心价值与适用场景 Perplexity 作为一款基于大语言模型的实时问答与研究工具,其“阅读推荐查询”能力并非简单的内容聚合,而是融合语义理解、来源可信度评估…...
深入解析Keil MDK FLM算法:SRAM运行原理与下载机制
1. 项目概述:FLM算法,Keil MDK下载的“灵魂引擎”如果你用Keil MDK给一块新的APM32或者STM32芯片下载程序,点下那个“Download”或“Load”按钮,几秒钟后“Programming Done”的提示框弹出,这个过程看似简单࿰…...
聚焦新型有效成分,守护爱宠健康
养宠过程中,用药安全是守护宠物健康的核心关键。多数养宠人选药时,常只关注品牌、价格或口碑,却忽略了药物有效成分这一核心根本。随着宠物医药技术迭代升级,多款新型专用药用成分落地应用,凭借精准、安全、低耐药的优…...
AI Agent 艺术创作能力探索
AI Agent 艺术创作能力探索:从生成式工具到自主创作主体的范式跃迁 关键词 AI Agent、生成式艺术、多模态创作、自主创作系统、计算美学、大模型推理、人机协同创作 摘要 本文从第一性原理出发,系统拆解AI Agent艺术创作的底层逻辑、技术架构、实现机制与产业价值。我们将…...
收藏必备!VSCode 超详细入门教程 从安装到精通
系统下载 1、KALI安装版 https://pan.quark.cn/s/483c664db4fb 2、KALI免安装版 https://pan.quark.cn/s/23d4540a800b 3、下载所有Kali系统 https://pan.quark.cn/s/7d8b9982012f 4、KALI软件源 https://pan.quark.cn/s/33781a6f346d 5、所有Linux系统 https://pan.…...
STM32按键状态机:从消抖到复杂事件处理的嵌入式编程范式
1. 项目概述:从“按键抖动”到“状态机思维”的跨越在嵌入式开发,尤其是基于STM32这类MCU的项目中,按键处理是几乎每个项目都绕不开的基础功能。很多新手朋友在拿到开发板,点亮第一个LED后,下一步往往就是尝试用按键来…...
避坑指南:STM32 HAL库SPI读写W25Q64时,你可能遇到的时序问题和调试技巧
STM32 HAL库SPI驱动W25Q64实战:时序陷阱与波形诊断全解析 当你的SPI Flash突然开始"装聋作哑",返回的不是预期数据而是清一色的0xFF或0x00时,这往往不是芯片的罢工抗议,而是时序对话中的"鸡同鸭讲"。本文将带…...
Obsidian 完整使用手册 — 目录与索引
Obsidian 完整使用手册 — 目录与索引 一份从入门到精通的 Obsidian 全面指南,涵盖基础操作、核心功能、插件生态、同步备份与进阶技巧。 手册列表 编号手册名称内容概要01基础入门篇软件安装、界面布局、库管理、核心设置02Markdown 语法篇格式化语法、扩展语法、…...
