C++时间库chrono_Time_point (三)
chrono_time_point (三)
文章目录
- chrono_time_point (三)
- 模板参数
- 源码解析
- 构造函数:
- 成员函数time_since_epoch()
- 例子
- timepoint提供的操作
- timepoint的溢出
- C和POSIX提供的Date/Time函数
- 演示案例(timepoint和日历时间的转换)
- 以计时器停滞线程
- this_thread::sleep_until,用于将线程休眠直到某个时刻:
- this_thread::sleep_for,用于将当前线程休眠多长时间:
模板参数
template <class Clock, class Duration = typename Clock::duration>class time_point;
std::chrono::time_point 表示一个具体时间,如上个世纪80年代、今天下午3点、火车出发时间等,只要它能用计算机时钟表示。
- 第一个模板参数Clock用来指定所要使用的时钟(标准库中有三种时钟,system_clock,steady_clock和high_resolution_clock。见4时钟详解),第二个模板函数参数用来表示时间的计量单位(特化的std::chrono::duration<> )
- 时间点都有一个时间戳,即时间原点。chrono库中采用的是Unix的时间戳1970年1月1日 00:00。所以time_point也就是距离时间戳(epoch)的时间长度(duration)。
源码解析
关键代码摘录如下(格式有调整):
template<class _Clock, class _Duration = typename _Clock::duration>
class time_point
{
public: typedef _Clock clock; typedef _Duration duration; constexpr time_point() : _MyDur(_Duration::zero()) {} constexpr explicit time_point(const _Duration& _Other) : _MyDur(_Other) {} template<class _Duration2, class = typename enable_if<is_convertible<_Duration2, _Duration>::value,void>::type> constexpr time_point(const time_point<_Clock, _Duration2>& _Tp) : _MyDur(_Tp.time_since_epoch()) {} constexpr _Duration time_since_epoch() const { return (_MyDur); } private: _Duration _MyDur; // duration since the epoch
}
注明:time_point要求其_Clock模板参数必须满足Clock的要求。
- time_point的实现很简单,使用Duration类型的成员变量存储时间,make sense!
- 仔细想想,时间点不就是从0时刻开始经过一定时间间隔的某一个时刻吗?
构造函数:
(1) |
time_point(); //默认构造函数,时间戳作为其值
|
---|---|
(2) |
template <class Duration2> time_point (const time_point<clock,Duration2>& tp); //拷贝构造函数
|
(3) |
explicit time_point (const duration& dtn); //使用duration构造,就是距离时间戳的时间长度
|
成员函数time_since_epoch()
时间点有个重要的函数:duration time_since_epoch() (用于获取当前时间点距离时间戳的时间长度)
例子
即经常用来得到当前时间点到1970年1月1日00:00的时间距离、该函数返回的duration的精度和构造time_point的时钟(Clock)有关(见4时钟详解)。
#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
int main()
{ //距离时间戳2两秒 chrono::time_point<chrono::system_clock, chrono::seconds> tp(chrono::seconds(2)); cout << "to epoch : " <<tp.time_since_epoch().count() << "s" <<endl; //转化为ctime,打印输出时间点 time_t tt = chrono::system_clock::to_time_t(tp); char a[50]; ctime_s(a, sizeof(a), &tt); cout << a; system("pause"); return 0;
}
timepoint提供的操作
- timepoint提供的操作如下:
timepoint的溢出
- 虽然timepoint的接口用了ratio,这确保了duration单元的溢出会导致编译器报错,但是duration的溢出还是可能会发生
- 见下面的例子:
- 这也说明了chrono是一个duration/timepoint程序库,而不是个date/time程序库。你可以计算duration和timepoint但仍然必须把epoch、最小和最大的timepoint、闰年和闰秒纳入考虑
C和POSIX提供的Date/Time函数
- **C和POSIX提供的Date/Time函数介绍参阅:**https://blog.csdn.net/qq_41453285/article/details/102651298
- *C++标准也提供了C和POSIX所提供的“处理date和time”接口*。原本在<time.h>内的宏、类型、函数,现在被定义在的namespace std内
- 所提供的操作如下图所示:
- 宏CLOCK_PER_SEC定义了clock()的单位类型(它返回的是elapsed CPU time,以1/CLOCK_PER_SEC秒计)
- time_t通常只是“始自UNIX epoch(1970年1月1日)的秒数”。然而根据C和C++标准的说法,也并不保证如此
演示案例(timepoint和日历时间的转换)
以计时器停滞线程
Duration和timepoint可用于线程或程序(即主线程)的停滞(block)。停滞可以是无条件的,也可以指定最大时间段,或等待一个lock或某条件成立,或等待另一线程结束
提供的操作如下:
- **sleep_for()和sleep_until():**由this_thead提供用以停滞线程
- **try_lock_for()和try_lock_until():**用来在等待一个mutex时指定最大时间段
- wait_for()和wait_until():用来在等待某条件成立或等待一个future时指定最大时间段
所有以…for()结尾的函数都会用到一个duration,所有以…until()结束的函数都会用到一个timepoint
。例如:
- this_thread::sleep_for(chrono::seconds(10)); //会停滞当前线程(不无可能是主线程)10秒钟
- this_thread::sleep_until(chrono::system_clock::now()+chrono::seconds(10)); //停滞当前线程,直到system clock 来到一个“比此刻多10秒”的timepoint
这些调用虽然看起来相同,其实不然:
- *所有…until()函数,你需要传递一个timepoint,而它收到时间调整的影响*。如果sleep_until()之后的10秒内system clock被调整了,停滞时间也会被相应调整。例如我们把system clock回调1小时,这个程序将被停滞60分钟又10秒。又如果我们把clock调快超过10秒,timer会立刻结束
- 如果使用…for()函数如sleep_for(),你必须传一个duration,或你使用steady_clock,那么system clock的调整通常不会影响duration。然而在一个不提供steady clock的硬件上,软件平台没机会在不受到“可能被调整的system time”的影响下计算秒数,因此时间的调整也会冲击…for()函数
所有这些timer都不会保证绝对精准。对任何timer而言都存在一点点延迟,因为系统只是周期性地检查那个timer结束了,而timer和interrupt(中断)的处理又需要花费一些时间。因此,timer的时间长度将会是它们所指定的时间加上一小段(取决于实现的质量和当下情势)
this_thread::sleep_until,用于将线程休眠直到某个时刻:
#include <iostream>
#include <chrono>
#include <thread>auto now() { return std::chrono::steady_clock::now(); }auto awake_time() {using std::chrono::operator""ms;return now() + 2000ms;
}int main()
{std::cout << "Hello, waiter...\n" << std::flush;const auto start {now()}; //获取当前时间std::this_thread::sleep_until(awake_time()); //当前线程睡眠直到当前时刻的2000ms后std::chrono::duration<double, std::milli> elapsed {now() - start}; //线程唤醒,计算时差std::cout << "Waited " << elapsed.count() << " ms\n";return 0;
}
运行程序输出:Hello, waiter...
Waited 1999.28 ms
this_thread::sleep_for,用于将当前线程休眠多长时间:
#include <iostream>
#include <chrono>
#include <thread>int main()
{using namespace std::chrono_literals;std::cout << "Hello waiter\n" << std::flush;auto start = std::chrono::high_resolution_clock::now();std::this_thread::sleep_for(2000ms);auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double, std::milli> elapsed = end-start;std::cout << "Waited " << elapsed.count() << " ms\n";return 0;
}
运行程序输出:Hello waiter
Waited 2000.07 ms
chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> elapsed = end-start;
std::cout << “Waited " << elapsed.count() << " ms\n”;
return 0;
}
运行程序输出:
Hello waiter
Waited 2000.07 ms
C++时间库chrono_Time_point (三)相关推荐
- Java日期及时间库插件 -- Joda Time.
转载自 Java日期及时间库插件 -- Joda Time. 来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用 ...
- netflix linux_Netflix如何处理故障转移,Anaconda,Linux命令行技巧,Python日期时间库,GDPR,微服务等
netflix linux 上周,Amjith Ramanujam的页面浏览量超过12,000, 关于Netflix如何在7分钟内完成故障转移的文章是我们失控的热门. 您是否有关于您的组织如何确保最大 ...
- java日期时间库-常用案例-不保留全分享
java日期时间库-常用案例-不保留全分享 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使 ...
- qpython3 安装库_qpython3安装库的三种方法
一个利用碎片化时间学习Python的利器:QPython.这是一款能够在安卓手机上运行Python的软件,你可以在地铁上.公交车上甚至在无聊的会议上随时随地练习Python. QPython是一种通用 ...
- Python疫起学习·万丈高楼平地起Day07(精简版|浓缩就是精华)集合、程序控制结构知识点附上鸡兔同笼问题以及时间库终结
二十一.集合 集合set属于Python无序可变序列.集合是使用大括号括起来的各种数据,可以看作没有Value的字典.集合里面的元素不能重复.集合中只能包含数字.字符串.元组等不可变类型(或者说是可哈 ...
- C++ Boost库:日期时间库 date_time
文章目录 1. 简介 2. 基本使用 3. date_period类 4. ptime类 5. time_period类 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 l ...
- 日期、时间库使用备注
日期.时间库 c/c++ 标准库 clock():返回程序消耗处理器时间 示例: /* clock example: frequency of primes */ #include <stdio ...
- C++_泛型编程与标准库(三)
C++_泛型编程与标准库(三) 图中标红部分为自己的笔记理解 1.分配器简单测试,后面还会单讲 实测VC2019在Microsoft Visual Studio\2019\Community\VC\T ...
- 下面介绍一个开源的OCR引擎Tesseract2。值得庆幸的是虽然是开源的但是它的识别率较高,并不比其他引擎差劲。网上介绍Tessnet2也是当时时间排名第三的识别引擎,只是后来慢慢不维护了,目前是G
下面介绍一个开源的OCR引擎Tesseract2.值得庆幸的是虽然是开源的但是它的识别率较高,并不比其他引擎差劲.网上介绍Tessnet2也是当时时间排名第三的识别引擎,只是后来慢慢不维护了,目前是G ...
最新文章
- Redmine Feedback
- Oracle数据库链Database links
- 集合元素处理(Stream方式)
- .NET6之MiniAPI(二十二):HttpClient
- 常用FTP命令 1. 连接ftp服务器
- HTML5,CSS3,JS绘制饼图
- oracle foreign 查询,ORACLE foreign key
- oracle时分秒修改值_Oracle SQL Developer显示的时间包含时分秒的设置方法
- getvalue参数计数不匹配_数据人:不懂业务,分析就仅仅只是提数
- 变电站计算机监控 规范,110kV变电站计算机监控系统技术规范书.docx
- 电脑开热点手机无法连接,显示无ip分配的问题
- 计算机综合应用教材,系统测评计算机综合应用技能期末作业教材.doc
- adobe xd 白屏闪退 终极拯救方法
- java 如何理解new_JAVA中new的 理解
- Python计算分位点与逆运算:根据给定的值,计算在序列中的分位水平
- Vue实现京东登陆页面(仅实现部分功能)
- 基于hadoop平台hive数据库处理电影数据
- matlab 多元回归分析 regress、 nlinfit 、stepwise函数
- 4. null 和 undefined区别?
- SAP PP模块常用事务代码