当前位置: 首页 > news >正文

基于boost asio实现的定时器

基于boost asio实现的定时器,包括一次性定时器、循环定时器、带开始时间的循环定时器

#pragma once
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time.hpp>
#include <iostream>using TimerCallbackFuncT = std::function<void()>;template <bool Periodic>
class Timer
{
public:Timer(boost::asio::io_context& io, int interval, TimerCallbackFuncT callback): m_interval(interval), m_timer(io, m_interval), m_callback(callback), m_periodic(Periodic){}~Timer() { m_timer.cancel(); }void Start() { m_running = true; AsyncWait(); }void Stop(){m_running = false;m_timer.cancel();}void Reset(int interval){boost::posix_time::seconds intv(interval);m_timer.expires_from_now(intv);}std::string ExpiresAt(){auto                               dt = m_timer.expires_at();boost::local_time::time_zone_ptr   zone(new boost::local_time::posix_time_zone("EST+08:00:00"));boost::local_time::local_date_time dt_with_zone(dt, zone);std::stringstream                  strm;strm.imbue(std::locale(std::cout.getloc(), new boost::local_time::local_time_facet("%Y-%m-%d %H:%M:%S UTC%Q")));strm << dt_with_zone;// std::cout << "timer: " << strm.str() << std::endl;return strm.str();}private:void AsyncWait() { m_timer.async_wait(boost::bind(&Timer::Hook, this, boost::asio::placeholders::error)); }void Hook(const boost::system::error_code& ec){if (ec){std::cout << "Timer error_code:(" << ec.value() << ") " << ec.message() << std::endl;}else if (m_callback){m_callback();}if (m_periodic && m_running){m_timer.expires_from_now(m_interval);// m_timer.expires_at(m_timer.expires_at() + m_interval);AsyncWait();}}private:// boost::asio::io_context&    m_io_context;boost::posix_time::seconds  m_interval;boost::asio::deadline_timer m_timer;TimerCallbackFuncT          m_callback;bool                        m_periodic;std::atomic<bool> m_running{false};
};using PeriodicTimer = Timer<true>;
using OnceTimer = Timer<false>;class PeriodicWithStartTimer
{
public:PeriodicWithStartTimer(boost::asio::io_context& io, int interval, int start, TimerCallbackFuncT callback): m_ptimer(io, interval, callback), m_otimer(io, start, std::bind(&PeriodicWithStartTimer::OnStart, this)), m_interval(interval){}void Start() { m_otimer.Start(); }void Stop(){m_otimer.Stop();m_ptimer.Stop();}std::string ExpiresAt(){std::stringstream ss;ss << "[" << m_otimer.ExpiresAt() << "][" << m_ptimer.ExpiresAt() << "]";return ss.str();}private:void OnStart(){m_ptimer.Reset(m_interval);m_ptimer.Start();}PeriodicTimer m_ptimer;OnceTimer     m_otimer;int           m_interval;
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++后端开发找了一个MFC桌面开发的实习(已投降)
  • 【软件设计书】详细设计说明书和概要设计说明书(Word原件直接套用)
  • idea的git与SVN切换
  • 前端初期知识点回顾
  • 运行pytorch自带的单元测试
  • MySQL:ORDER BY 排序查询
  • BEVGPT展示自动驾驶的“全知视角”,预测决策规划三合一的革新之作!
  • 51单片机嵌入式开发:21、STC89C52R控制抢答器+数码管+后台显示+LCD1602x显示
  • 排序算法详解
  • 昇思25天学习打卡营第13天 |昇思MindSpore 基于 MindSpore 实现 BERT 对话情绪识别
  • 非插件实现给wordpress添加社交软件的分享按钮
  • 运维工作中的事件、故障排查处理思路
  • OpenAI突然上线两件“杀手锏”:势在维持大模型霸主地位
  • vscode自动优化verilog 格式
  • CentOS安装sentry
  • python3.6+scrapy+mysql 爬虫实战
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [Vue CLI 3] 配置解析之 css.extract
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2019年如何成为全栈工程师?
  • Angular 4.x 动态创建组件
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • JavaScript设计模式之工厂模式
  • Linux各目录及每个目录的详细介绍
  • React的组件模式
  • SQL 难点解决:记录的引用
  • STAR法则
  • Yeoman_Bower_Grunt
  • 计算机在识别图像时“看到”了什么?
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 一个项目push到多个远程Git仓库
  • 用Canvas画一棵二叉树
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Hibernate主键生成策略及选择
  • Java数据解析之JSON
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Semaphore
  • #java学习笔记(面向对象)----(未完结)
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma data_seg 共享数据区(转)
  • $NOIp2018$劝退记
  • (06)金属布线——为半导体注入生命的连接
  • (二)测试工具
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (分享)自己整理的一些简单awk实用语句
  • (算法)N皇后问题
  • (学习日记)2024.01.09
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (一)认识微服务
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .apk文件,IIS不支持下载解决
  • .NET 5种线程安全集合
  • .NET Project Open Day(2011.11.13)