C++:Reference:chrono学习

这篇具有很好参考价值的文章主要介绍了C++:Reference:chrono学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

Time library

  • chrono 是 header 名称,也是子命名空间的名称:此header头中的所有元素不是直接在std命名空间下定义的(这与大多数标准库一样),而是在 std::chrono命名空间下定义。
  • 在 chrono header 文件中的元素是处理时间的,主要通过下面三个概念实现。
    C++:Reference:chrono学习

1:Durations

  • 它测量的是时间跨度,比如:一分钟,两小时或十毫秒。
  • 在这个库中,用持续时间类模板对象来表示:该模板将计数表示和周期精度相耦合(例如:10毫秒,10作为计数表示,毫秒作为周期精度)。

1.1 :Duration构造函数

#include<iostream>
#include<ratio>
#include<chrono>
int main()
{
	// 定义一个秒为单位来衡量时间间隔的情况。
	typedef std::chrono::duration<int> seconds_type;
	// 这里定义了一个duration类型,这个类型需要两个参数:第一个参数是时间长度的类型(int类型),第二个参数是时间单位(这里是毫秒)
	typedef std::chrono::duration<int,std::milli> milliseconds_type;
	// 这里定义了一个duration类型,这个类型需要两个参数,第一个参数指定了时间长度的基本单位(在这里是int 表示是整数),第二个参数指定时间之间的比例关系(在这里是:std::ratio<60*60>,表示一小时等于60分钟,一分钟等于60秒)
	// 所以, houre_type表示:以小时为单位的时长,可以用来定义变量,函数返回值等等。
	typedef std::chrono::duration<int,std::ratio<60*60>> hours_type;

	hours_type h_oneday(24);  // 24h
    std::cout << h_oneday.count() << std::endl;

	seconds_type s_oneday(h_oneday);  // 86400s
    std::cout << s_oneday.count() << std::endl;

	milliseconds_type ms_day(s_oneday);
	std::cout << ms_day.count() << std::endl;
}

// 打印结果
24
86400
86400000

1.2 静态成员函数count

函数原型
constexpr rep count() const;
返回值
此duration 的计次数。

std::cout << foo.count() * milliseconds::period::num / milliseconds::period::den;

 - 这是C++ 用来输出时间间隔的代码,其中 foo是 duration类型的一个变量
 - count() 用于获取foo的时间长度数量(计次数)
 - millisseconds::period::num 和 milliseconds::period::den
 - 是C++标准库中duration常量,
 -  milliseconds 时钟周期转换为浮点数表示的秒数。其中,milliseconds::period::num 表示时钟周期中每秒的计数,milliseconds::period::den 表示秒数的计数。
 - 通过除法运算可以得到每个时钟周期所表示的秒数。

#include<iostream>
#include<chrono>
int main()
{
	using namespace std::chrono;
	// std::chrono::milliseconds is an instatiation of std::chrono::duration
	milliseconds foo(1000);  // 1 second
	foo*=60;
	std::cout << "duration (in periods):";
	std::cout<< foo.count() << " milliseconds.\n";

    std::cout<< " duration (in seconds): ";
    std::cout << foo.count()*milliseconds::period::num/milliseconds::period::den;
    std::cout<< " seconds.\n";
    return 0;

}
//  打印结果
 duration (in periods):60000 milliseconds.
 duration (in seconds): 60 seconds.

1.3 duration_cast分析

将duration的值转换其他持续时间类型,同时也考虑它们之间的差异性。

Example
#include<iostream>
#include<chrono>
int main()
{
	std::chrono::seconds sec(1);  // 1s
	std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds> (sec);
	ms += std::chrono::milliseconds(2500); // 2500 millisecond
	sec = std::chrono::duration_cast<std::chrono::seconds>(ms);

   std::cout << "millseconds: " << ms.count() <<std::endl;
   std::cout << "senconds: " << sec.count() << std::endl;
	
}

打印结果
illseconds: 3500
senconds: 3

2:Time points

  • 它表示一个特定的时间点,比如一个人的生日,今天的黎明,或者下一班火车经过的时间点。
  • 在这个库中 :time_point 类模板的对象通过使用相对于 epoch的持续时间来表达这一点。
  • 相对于epoch 持续时间: 指的是一个特定的时间:1970-01-01 00:00:00 UTC
  • 在内部,该对象存储一个持续时间类型的对象,并使用Clock类型作为其 epoch的引用。
  • 💚💚💚
  • Importantly
  • A Clock class ,Such as system_clock steady_clock , high_resolution_clock or a custom clock

3:clocks

  1. 它是一种框架:一种将时间点与实际物理时间联系起来的矿建
  2. 此库提供了至少三个时钟,它们提供了将当前时间表示为时间点的方法:system_clock , steady_clock , high_resolution_clock

💚💚💚💚

  • system_clock:它所表现的 timepoint 将关联至现行系统的即时时钟(real-time clock), 这个clock 提供便捷函数 to_time_t() 和 from_time()_t()
  • steady_clock: 它保证绝不会被调整,因此当实际时间流逝,其 timepoint 值绝不会减少,而且这些 timepoint 相对于真实时间都有稳定的前进速率
  • high_resolution_clock : 它表现的是当前系统中带有最短 tick 周期 的clock .

案例 :

打印当前时间毫秒值,并转换成日历形式
1: 通过 system_clock::now() 获取 current time
2:定义一个 asString() 函数,它会将一个 以 system clock为依据的 timepoint 转换为 日历时间

#include<iostream>
#include<chrono>
#include<ctime>
int main()
{

   //std::chrono::system_clock::time_point tp;
   std::chrono::time_point<std::chrono::system_clock> tp;
   tp = std::chrono::system_clock::now();
  // tp = std::chrono::system_clock::time_point::max();
  // tp = std::chrono::system_clock::time_point::min();
   std::time_t t = std::chrono::system_clock::to_time_t(tp);
   std::cout <<"current time: "<< t ;

    std::string ts = std::ctime(&t);
    std::cout << "\ncontain time zone(beijing time)\n"<< ts;

    std::string ts1 = std::asctime(gmtime(&t));
    std::cout << "\nUTC time\n"<< ts1;
    
     std::string ts2 = std::asctime(localtime(&t));
    std::cout << "\ncontain time zone(beijing time)\n"<< ts2;
   
}

// 打印结果
current time: 1680700886
contain time zone(beijing time)
Wed Apr  5 21:21:26 2023

UTC time
Wed Apr  5 13:21:26 2023

contain time zone(beijing time)
Wed Apr  5 21:21:26 2023

🚀🚀🚀🚀🚀

几个问题需要说明

  1. std::chrono::time_point <std::chrono::system_clock > tp; 等价于 :std::chrono::system_clock::time_point tp;

但是你不能这么定义:std::chrono::time_point tp;
这样定义会报错 :no viable constructor or deduction guide for deduction of template arguments of ‘time_point’

  1. 将 timepoint 转换成 日历时间:

1:std::time_t time = std::chrono::system_clock::to_time_t(timepoint)
2:我们采用的是 static 函数 to_time_t() ,它会将 timepoint 转换为一个 “传统C和POSIX”提供的时间类型 time_t" 的对象,而那通常表型为 自UNIX epoch 起,亦即自 1970年1月1日起 开始计算的秒数
3:然后使用 ctime(& time) 转换成 一个 日历表示法。

  1. UTC 时间和 local 时间

1: std::ctime(&time) 和 std::asctime(localtime(&time)) 均表示 当地时间(即已经换算了时区)
2: std::asctime(gmtime(&t)) 表示 UTC 全球标准时间(没有换算时区)

实际应用

1:比较程序行两个时间点或计算其差距

// 定义起始时间
auto system_start = chrono::system_clock::now();
// 检查程序是否执行超过一分钟
if (std::chrono::system_clock::now() > system_start + std::chrono::minutes(1));

2:以计时器停滞线程 (Blocking with Timer)

1:Duration 和 timepoint 可用于线程或者程序(即主线程)的停滞(Block)。
2:停滞可以是无条件的,也可以是指定最大时间段,或等待一个 lock 或某条件成立,或等待另一个线程结束。

sleep_for()sleep_until(): 由 this_thread提供用以停滞线程
try_lock_for()try_lock_until():用来在等待一个 mutex时指定最大时间段
wait_for()wait_until():用来在等待某条件成立或等待一个 future时指定最大时间段。

Explame文章来源地址https://www.toymoban.com/news/detail-402591.html

// 停滞当前线程(也有可能是主线程)10s
std::this_thread::sleep_for(std::chrono::seconds(10))
// 停滞当前线程(也有可能是主线程),直到system clock 来到一个“比此刻多10s”的 timepoint
std::this_thread::sleep_until(std::chrono::system_clock::now()
                  + std::chrono::seconds(10));


到了这里,关于C++:Reference:chrono学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Dev C++中出现 undefined reference to XXX 错误的解决方式

    Dev C++中出现 undefined reference to XXX 错误的解决方式

            主函数中调用在其他文件中定义的函数,编译报错:未定义的引用xxx。         原理:编译器在生成可执行文件的过程包括预处理、编译、汇编、链接,这4个过程,这个问题一般出现在 链接 过程,所谓的链接过程,就是把不同的目标文件粘合在一起,生成一

    2024年02月03日
    浏览(13)
  • 侯捷 C++ part2 兼谈对象模型笔记——7 reference、const、new/delete

    7.1 reference x 是整数,占4字节; p 是指针占4字节(32位); r 代表 x ,那么 r 也是整数 ,占4字节 引用与指针不同,只能代表一个变量,不能改变 引用底部的实现也是指针,但是注意 object 和它的 reference 的 大小是相同的,地址也是相同的 (是编译器制造的假象) reference 通

    2024年02月12日
    浏览(31)
  • yolov8使用C++推理的流程及注意事项
 undefined reference to `xxxxx‘

    yolov8使用C++推理的流程及注意事项  undefined reference to `xxxxx‘

    1.下载yolov8项目源码GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch ONNX OpenVINO CoreML TFLite  2.下载opencvReleases - OpenCV,建议版本=4.7.0,选择下载源码, windows版本由于使用的编译器与我们所使用的mingw不一致,后续会出现错误,所以我们选择自己编译 3.下载cmake编译工具,添加到环

    2024年02月11日
    浏览(34)
  • std::chrono时间处理

    std::chrono是C++11引入的标准库,用于时间的计算和处理。它按照ISO8601标准定义了多个时间类,例如:duration(持续时间)、time_point(时间点)和clock(时钟)。以下是一些常见的用法: 输出 线程的等待时间 获取当前时间 输出 时间转换 在工作中上述的时间不是我们需要的,通

    2024年02月08日
    浏览(10)
  • 【VulnHub靶场】——CHRONOS: 1

    【VulnHub靶场】——CHRONOS: 1

    作者名:Demo不是emo  主页面链接 : 主页传送门 创作初心: 一切为了她 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: 网络安全,数据结构 每日emo: 要做个明亮的人,要有个珍藏的故事,要看遍山河日落,要不虚此行。  从10月中旬开始制定了 为期24周的打靶训练

    2024年02月09日
    浏览(10)
  • 第三周-vulnhub-Chronos

    第三周-vulnhub-Chronos

    扫描具体的服务 两个简单的网页 查看源代码,得到一些信息 很明显,这段脚本的内容似乎都是经过了编码处理,导致很难从语义,函数名称等等角度来读懂这段代码的含义 遇到这种情况,一般会对 JS 代码进行美化、还原、整理操作 使用cyberchef解密出来 将 JS 代码粘贴到输

    2024年02月08日
    浏览(9)
  • 物理学建模及仿真平台Chrono安装

    物理学建模及仿真平台Chrono安装

    Chrono是一个基于物理学的建模和仿真基础设施,它是在C++中实现的独立于平台的开源设计。一个projectchrono库可以嵌入到一个软件项目中,例如在可变形地形上运行的轮式和履带式车辆、机器人、机械电子系统、顺应性机构和流体固体相互作用现象。系统可以由刚性和柔性/顺

    2024年02月09日
    浏览(13)
  • 【区块链共识协议论文】【拜占庭异步通信】【Chronos: An Efficient Asynchronous Byzantine Ordered Consensus】

    【区块链共识协议论文】【拜占庭异步通信】【Chronos: An Efficient Asynchronous Byzantine Ordered Consensus】

    1、 版权归属:牛津大学出版社(Oxford University Press) 2、 笔者为共同作者之一,联系方式:E230047@e.ntu.edu.sg 3、 引用格式: 4、 代码仓库:见GitHub 第1页 第2页 第3页 第4页 第5页 第6页 第7页 第8页

    2024年02月20日
    浏览(14)
  • 3.解决Pycharm报错Unresolved reference ‘selenium‘ Unresolved reference ‘webdriver‘

    3.解决Pycharm报错Unresolved reference ‘selenium‘ Unresolved reference ‘webdriver‘

    目录 问题 解决方案 出现该问题可能是由于编辑器中没有找到Selenium的路径,把路径添加上去就可以解决问题 1.打开编辑器中的setting 2.点击+Add Content Root   3.找到安装selenium的路径  4.点击Apply之后再点击Sources 5.最后点击Apply然后点击OK返回主界面,报错解决

    2024年02月13日
    浏览(11)
  • 【SD】Reference 表情包 - 1

    【SD】Reference 表情包 - 1

    文生图 图片大小:512X512 CFG:(如果不相符合,拉高权重) 有关提示词 chibi        Q版 close UP face 大头 upper body 上半身 采样迭代步数        30 white background 白色背景 1:自制自己的表情包,将图片训练成LORA,使用人物lora+生成照片 2:将一张照片,图生图,变成卡通风

    2024年02月02日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包