C++11实现高精度定时器、计时器

直接上代码

#pragma once
#ifndef _TIMER_H_
#define _TIMER_H_#include <functional>
#include <chrono>
#include <thread>
#include <atomic>
#include <memory>
#include <mutex>
#include <condition_variable>
#include <Windows.h>
using namespace std;class TimeRecord
{public:TimeRecord() : m_beginTime(chrono::high_resolution_clock::now()) {}void reset() { m_beginTime = chrono::high_resolution_clock::now(); }//return millisecondsint64_t elapsed() const{return chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - m_beginTime).count();}//return microsecondsint64_t elapsed_micro() const{return chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now() - m_beginTime).count();}//return nanosecondsint64_t elapsed_nano() const{return chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now() - m_beginTime).count();}//return secondsint64_t elapsed_seconds() const{return chrono::duration_cast<chrono::seconds>(chrono::high_resolution_clock::now() - m_beginTime).count();}//return minutesint64_t elapsed_minutes() const{return chrono::duration_cast<chrono::minutes>(chrono::high_resolution_clock::now() - m_beginTime).count();}//return hoursint64_t elapsed_hours() const{return chrono::duration_cast<chrono::hours>(chrono::high_resolution_clock::now() - m_beginTime).count();}
private:chrono::time_point<chrono::high_resolution_clock> m_beginTime;
};class Timer
{public:Timer() : m_expired(true), m_tryToExpire(false){}Timer(const Timer& timer){m_expired = timer.m_expired.load();m_tryToExpire = timer.m_tryToExpire.load();}~Timer(){stop();}//sleep for millisecondsvoid millSleep(long milliseconds){LARGE_INTEGER litmp;LONGLONG QPart1, QPart2;double dfMinus, dfFreq, dfTim, dfSpec;QueryPerformanceFrequency(&litmp);dfFreq = (double)litmp.QuadPart;QueryPerformanceCounter(&litmp);QPart1 = litmp.QuadPart;dfSpec = 0.001*milliseconds;do{QueryPerformanceCounter(&litmp);QPart2 = litmp.QuadPart;dfMinus = (double)(QPart2 - QPart1);dfTim = dfMinus / dfFreq;} while (dfTim < dfSpec);}void startOnce(int delay, function<void()> task){thread([delay, task]() {this_thread::sleep_for(chrono::milliseconds(delay));task();}).detach();}void start(int interval, function<void()> task){// is started, do not start againif (m_expired == false)return;// start async timer, launch thread and wait in that threadm_expired = false;thread([this, interval, task]() {while (!m_tryToExpire){// sleep every interval and do the task again and again until times up//this_thread::sleep_for(chrono::milliseconds(interval));  There is an error of about 10 millisecondsmillSleep(interval);task();}{// timer be stopped, update the condition variable expired and wake main threadlock_guard<mutex> locker(m_mutex);m_expired = true;m_expiredCond.notify_one();}}).detach();}void stop(){// do not stop againif (m_expired)return;if (m_tryToExpire)return;// wait until timer m_tryToExpire = true; // change this bool value to make timer while loop stop{unique_lock<mutex> locker(m_mutex);m_expiredCond.wait(locker, [this] {return m_expired == true; });// reset the timerif (m_expired == true)m_tryToExpire = false;}}private:atomic<bool> m_expired; // timer stopped statusatomic<bool> m_tryToExpire; // timer is in stop processmutex m_mutex;condition_variable m_expiredCond;
};
#endif /

测试代码

 Timer timer;std::cout << "--- start period timer ----" << std::endl;timer.start(10, std::bind(func2, 3));std::cout << "--- stop period timer ----" << std::endl;timer.stop();

参考文档
https://zhuanlan.zhihu.com/p/64746342
https://www.bbsmax.com/A/WpdKgpLndV/
https://blog.csdn.net/zj1131190425/article/details/98777584
https://www.runoob.com/cplusplus/cpp-date-time.html
https://blog.csdn.net/wangningyu/article/details/82051206

C++11实现高精度定时器、计时器相关推荐

  1. hpet 定时器中断 8259 linux,[OSDEV]编程高精度定时器(HPET)

    高精度定时器HPET和I/O APIC一样,用的是内存映射,映射的地址保存在BIOS提供的ACPI表格中 我们首先来获取这个地址 获取HPET的I/O内存地址 先来看一下文档的30-31页: 关键就是 ...

  2. python高精度定时器中断_0015 高精度定时器

    0012提过高精度时钟中断,这篇来讲下定时器. 传统操作系统内核一般都有个时间片tick,即相隔一定时间发生一次时钟中断,比如1毫秒,10毫秒,dos时代的1/18.5秒,有高精度时钟之后,我们通过定 ...

  3. 多媒体高精度定时器介绍

    一:背景 在Windows系统下播放多媒体时,需要去精确控制播放过程,如果用Windows产生的WM_TIMER常规定时器来实现,多媒体画面会出现断断续续的现象,原因在于WM_TIMER只能提供大于等 ...

  4. 高精度定时器学习(通过官方手册学习)

    高精度定时器学习 功能描述 一般说明 HRTIM引脚和内部信号 时钟 Timer A..E timing units 翻转事件 功能描述 一般说明 HRTIM可以划分为几个模块: •主定时器 •计时单 ...

  5. Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例

    之前介绍了timer_list内核定时器,它的精度在毫秒级别,再高一点它就无能为力了,所幸内核提供了高精度定时器 hrtimer. 源文件在linux/kernel/hrtimer.c中.接口简单.下 ...

  6. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

  7. 在线高精度在线计时器(秒表)

    在线高精度在线计时器(秒表) 秒表计时器,能够记录多个时间点的秒数.操作简单,易于使用.点开始后秒表即开始计时,在秒表运行的时候可以进行多次分割,停止后可一键复位. 在线高精度在线计时器(秒表 htt ...

  8. 由于高精度事件计时器(HPET)驱动过时导致AMD机器装Win10的卡死蓝屏问题记录

    AMD机型最近频繁卡死,蓝屏,特征在于:打游戏等高负载条件,电脑没有问题:闲置一定时间之后蓝屏或者死机,鼠标键盘无反应,界面全部卡死,只能按开机键重启.未保存的数据全部丢失. 近日蓝屏代码 有两类,一 ...

  9. 高精度在线计时器(秒表)

    高精度在线计时器(秒表) 高精度在线计时器(秒表) 在线高精度在线计时器(秒表) 在线高精度在线计时器(秒表) 在线高精度在线计时器(秒表) https://tooltt.com/stopwatch/

最新文章

  1. PHP学习笔记-PHP语言基础3
  2. 微服务部署:蓝绿部署、滚动部署、灰度发布、金丝雀发布
  3. 寻一名师傅叫我破译电脑各种密码和攻克防火墙
  4. python生成静态库_使用boost.python静态库
  5. 【计蒜客 - 2019南昌邀请赛网络赛 - K】MORE XOR(数学,找规律,打表)
  6. LeetCode 2059. 转化数字的最小运算数(BFS)
  7. java socket通讯_Java socket通讯实现过程及问题解决
  8. 2016集训队论文吉如一
  9. 视频处理中各个分辨率/数字电视系统显示格式 的介绍(QCIF,CIF,4CIF,D1,720P,1080I,1080P等)
  10. 有哪个瞬间让你觉得这个世界出bug了?
  11. CentOS 安装HTTP代理服务器Tinyproxy---配置简捷
  12. 重启随机游走(RWR)算法
  13. 四轴飞行器-概念扫盲
  14. 塔望食业洞察|鹰嘴豆市场发展及应用趋势研究
  15. Vue项目如何过滤全部console.log输出(浅水魚)
  16. 安卓虚拟键盘_逍遥安卓模拟器工作室版下载-逍遥安卓模拟器工作室版PC版下载v7.2.8...
  17. 贴吧顶贴软件《今日/更新》
  18. delete 多表删除的使用(连表删除)
  19. 面试Java程序员必备的JVM知识
  20. 无限法则服务器选择吗,开发者Q&A—DX12专题5.18.2019

热门文章

  1. JDK8新特性的讲解
  2. PHP开发搭建游戏联运sdk
  3. 区块链引爆金融媒体:同花顺固守,新浪财经反思,韭菜财经谋变
  4. 华为云会议,居家办公好帮手
  5. LeetCode 39:组合总和(Javascript 解答)
  6. 红客联盟初步完成整顿 拟大举攻击日反华网
  7. Python 介绍pylab和绘图设置显示中文的方法
  8. Maya场景渲染(三)
  9. 跨平台的网络云盘软件设计实现【二】
  10. es倒排索引原理,强烈推荐