IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++时间类 std::chrono -> 正文阅读

[C++知识库]C++时间类 std::chrono

时间在C++中的具体表示方式。

1、时钟类

就C++标准库而言,时钟(clock)是时间信息的来源。具体来说,每种时钟都是一个类,提供4项关键信息:

  • 当前时刻;
  • 时间值的类型(从该时钟取得的时间以它为表示形式);
  • 该时钟的计时单元的长度(tick period);
  • 计时速率是否恒定,即能否将该时钟视为恒稳时钟(steady clock)。

若要获取某时钟类的当前时刻,调用其静态成员函数now() 即可。每个时钟类都具有名为 time_point 的成员类型,它是该时钟类自有的时间点类。

//返回系统时钟的当前时刻,返回值的类型就是system_clock::time_point
std::chrono::system_clock::now();

cout<<std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())<<endl;//等于 time(NULL);

时钟类的计时单元属于名为period的成员类型,它表示为秒的分数形式。若时钟每秒计数25次,它的计时单元即为std::ratio<1,25>;(1/25s)。

若时钟的计时速率恒定(无论速率是否与计时单元相符)且无法调整,则称之为恒稳时钟。时钟类具有静态数据成员is_steady,该值在恒稳时钟内为true,否则为false。

  • std::chrono::system_clock类不是恒稳时钟,因为它可调整。
  • C++标准库提供了恒稳时钟类std::chrono::steady_clock。
  • 高精度时钟类std::chrono::high_resolution_clock

2、时长类

std::chrono::duration<>是标准库中最简单的时间部件。它是类模板,具有两个模板参数,前者指明采用何种类型表示计时单元的数量(如int、long或double),后者是一个分数,设定该时长类的每一个计时单元代表多少秒。
例,采用short值计数的分钟时长类是std::chrono::duration<short,std::ratio<60,1>>。

标准库在std::chrono名字空间中,给出了一组预设的时长类的typedef声明:nanoseconds、microseconds、milliseconds、seconds、minutes和hours,分别对应纳秒、微秒、毫秒、秒、分钟、小时

C++14引入了名字空间std::chrono_literals,其中预定义了一些字面量后缀运算符。

using namespace std::chrono_literals;
auto one_day=24h;
auto half_an_hour=30min;
auto max_time_between_messages=30ms;
//15ns和std::chrono::nanoseconds(15)是两个相等的值

显式转换通过std::chrono::duration_cast<>完成。

std::chrono::miliseconds ms(54802);
std::chrono::seconds s = std::chrono::duration_cast<std::chrono::seconds>(ms);//结果被截断,而非四舍五入,故此,时长变量s的值是54

时长类支持算术运算,将时长乘或除以一个数值(这个数值与该时长类的计数类型相符,即其第一个模板参数),或对两个时长进行加减,就能得出一个新时长。所以,5*seconds(1)等于seconds(5),还等于minutes(1) ?seconds(55)。

计时单元的数量可通过成员函数count()获取,因而std::chrono::milliseconds(1234).count()得到1234。

3、时间点类

时间点由类模板std::chrono::time_point<>的实例表示,它的第一个模板参数指明所参考的时钟,第二个模板参数指明计时单元[19](std::chrono::duration<>的特化)。

可以在给定的时间点上调用time_since_epoch(),这个成员函数返回一个时长对象,表示从时钟纪元到该时间点的时间长度。

可以用std::chrono::time_pointstd::chrono::system_clock,std::chrono::minutes指定一个时间点,它持有某个时刻,以系统时钟为参考,计时单元则为分钟。

我们可将时间点加减时长(即令std::chrono::time_point<>的实例加减std::chrono::duration<>实例),从而得出新的时间点。据此,std::chrono::high_resolution_clock:: now() + std::chrono::nanoseconds(500)会给出500纳秒以后的未来时刻。

    auto start=std::chrono::high_resolution_clock::now();
    //usleep(2*1000*1000+820*1000);
    sleep(2);
    auto stop=std::chrono::high_resolution_clock::now();
    cout<<std::chrono::duration_cast<std::chrono::seconds>(stop-start).count()<<" seconds | "<<(stop-start).count()<<" ns"<<endl;
//输出2 seconds | 2000080569 ns

接受超时时限的函数

有两种超时机制可供选用:

  • 一是迟延超时(duration-based timeout),线程根据指定的时长而继续等待(如30毫秒);
  • 二是绝对超时(absolute
    timeout),在某特定时间点来临之前,线程一直等待。

处理迟延超时的函数变体以“_for”为后缀,而处理绝对超时的函数变体以“_until”为后缀。
例如,std::this_thread::sleep_for()和std::this_thread::sleep_until()。它们的功能就像简单的闹钟:线程或采用sleep_for()按指定的时长休眠(接收std::duration<>实例),或采用sleep_until()休眠直到指定时刻为止(接收std::duration<>)。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:22:53  更:2022-04-18 17:27:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:27:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码