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检索服务),很容易就被扫出来各种高危漏洞,而且这些漏洞我们在处理起来是很棘手的ÿ…...
像素剧本圣殿企业应用:中小型内容工作室剧本量产工作流搭建
像素剧本圣殿企业应用:中小型内容工作室剧本量产工作流搭建 1. 剧本创作新范式 在内容创作行业,剧本开发一直是耗时费力的核心环节。传统编剧流程中,一个完整剧本从构思到成稿往往需要数周甚至数月时间,这对于资源有限的中小型工…...
漫画翻译效率提升300%:深度学习辅助工具实战指南
漫画翻译效率提升300%:深度学习辅助工具实战指南 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项目地址: https://git…...
实战应用:基于快马平台开发企业内网服务可用性监控系统
今天想和大家分享一个最近用InsCode(快马)平台快速实现的实用项目——企业内网服务可用性监控系统。这个需求来源于我们公司内部的实际痛点:随着服务器数量增加,经常出现某个服务端口异常但没人及时发现的情况。 1. 项目背景与需求分析 我们公司有几十…...
Phi-3-mini-4k-instruct-gguf免配置环境:开箱即用的Web UI,开发者5分钟上手
Phi-3-mini-4k-instruct-gguf免配置环境:开箱即用的Web UI,开发者5分钟上手 1. 认识Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本。这个模型特别适合处理问答、文本改写、摘要整理和简短创…...
别再死磕手册了!用Vivado 2023.1手把手教你配置Aurora 64B/66B IP核(附完整复位时序图)
Vivado 2023.1实战:Aurora 64B/66B IP核配置全流程解析 在FPGA高速通信领域,Aurora协议凭借其轻量级、高带宽的特性成为众多工程师的首选。但对于初学者而言,官方文档PG074中复杂的复位时序和参数配置往往让人望而生畏。本文将基于Vivado 202…...
RobotFramework自定义关键字开发指南:用Python扩展你的测试库
RobotFramework自定义关键字开发实战:Python扩展与分层设计 1. 为什么需要自定义关键字? 在自动化测试领域,RobotFramework以其关键字驱动的特性广受欢迎。但当你深入使用后会发现,标准库和第三方库提供的关键字往往无法完全满足…...
LOSEHU固件:解锁泉盛UV-K5/K6对讲机专业潜能的终极解决方案
LOSEHU固件:解锁泉盛UV-K5/K6对讲机专业潜能的终极解决方案 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 还在为对讲机原厂固件的功…...
千问3.5-2B多场景落地:教育答题辅助、医疗报告图解、工业设备图识别实战分享
千问3.5-2B多场景落地:教育答题辅助、医疗报告图解、工业设备图识别实战分享 1. 引言:视觉语言模型的新应用 在数字化浪潮中,视觉语言模型正悄然改变着多个行业的运作方式。千问3.5-2B作为Qwen系列的小型视觉语言模型,凭借其图片…...
基于Qwen3.5-2B的操作系统概念学习助手
基于Qwen3.5-2B的操作系统概念学习助手 1. 为什么需要操作系统学习助手 计算机专业的学生在学习操作系统时,常常面临抽象概念难以理解、理论实践脱节的问题。传统教材中的进程、线程、死锁等概念,如果仅靠文字描述,往往让初学者感到晦涩难懂…...
2026别墅地下室保养升值的最好方法:电渗透技术的应用
别墅地下室随着人们日益增长的生活质量,功能也逐渐变得丰厚。当今时代不少业主都会在地下室加装健身房,酒窖以及影视厅等。这些功能区建设完毕初期给人无不良影响,但是随着时间的渐长,湿气不断渗透,首先空气潮湿度会给…...
