当前位置: 首页 > 知识库问答 >
问题:

保持std::chrono time_point实例

锺离边浩
2023-03-14

保持std::chrono time_point实例,然后将它们读回相同类型的另一个实例的正确方法是什么?

   typedef std::chrono::time_point<std::chrono::high_resolution_clock> time_point_t;

   time_point_t tp = std::chrono::high_resolution_clock::now();
   serializer.write(tp);
   .
   .
   .
   time_point_t another_tp;
   serializer.read(another_tp);

对写/读的调用假设time_point_t类型的实例可以以某种方式转换为字节表示,然后可以对磁盘或套接字等进行写入或读取。

Alf建议的一个可能的解决方案如下:

   std::chrono::high_resolution_clock::time_point t0 = std::chrono::high_resolution_clock::now();

   //Generate POD to write to disk
   unsigned long long ns0 = t0.time_since_epoch().count();

   //Read POD from disk and attempt to instantiate time_point
   std::chrono::high_resolution_clock::duration d(ns0)

   std::chrono::high_resolution_clock::time_point t1(d);

   unsigned long long ns1 = t1.time_since_epoch().count();

   if ((t0 != t1) || (ns0 != ns1))
   {
      std::cout << "Error time points don't match!\n";
   }

<罢工> 注意:上面的代码有一个bug,因为最终实例化的时间点与原来的不匹配。

在旧样式time_t的情况下,通常只需根据其大小将整个实体写入磁盘,然后以同样的方式读回-简而言之,新的std::chrono类型的等价物是什么?

共有1个答案

卫财
2023-03-14

time_point构造函数采用duration,您可以从成员time_since_epoch获取duration。因此,问题简化为序列化duration值。而duration具有一个构造函数,它采用一定数量的刻度,以及一个成员函数count产生刻度的数量。

这一切只需谷歌搜索std::chrono::time_point并查看谷歌为我提供的cppreference文档。

阅读文档通常是个好主意。

增编:一个例子。

#include <chrono>
#include <iostream>
#include <typeinfo>
using namespace std;

auto main() -> int
{
    using Clock = chrono::high_resolution_clock;
    using Time_point = Clock::time_point;
    using Duration = Clock::duration;

    Time_point const t0 = Clock::now();

    //Generate POD to write to disk
    Duration::rep const ns0 = t0.time_since_epoch().count();

    //Read POD from disk and attempt to instantiate time_point
    Duration const d(ns0);
    Time_point const t1(d);

    cout << "Basic number type is " << typeid( ns0 ).name() << "." << endl;
    if( t0 != t1 )
    {
        cout << "Error time points don't match!" << endl;
    }
    else
    {
        cout << "Reconstituted time is OK." << endl;
    }
}

在Visual C++12.0中,报告的基本类型为__int64,即long long,而在Windows中的G++4.8.2中,报告的类型为x,这可能意味着相同的含义。

补遗:正如Dina在注释中所指出的,从C++14开始,C++标准没有指定历元,因此,为了使其在机器上或在不同时钟上工作,必须添加额外的步骤,使序列化html" target="_blank">数据的历元规范化,例如,最自然的是到Posix时间,即自1970年1月1日星期四00:00:00协调世界时(UTC)以来的时间。

 类似资料:
  • 我知道互斥体通常也会保护共享数据,使用原子变量只是一个例子。问题不是如何保护共享数据,而是是否需要使用相同的互斥体来保护两者。另一个使用第二互斥体的示例:

  • 让事件持续发生一段时间 用法 “保持”节点可以: 保持输入的值,直到另一个“no”没有值出现 在一段时间内保持输入的值不变 让输入逐渐的变化 Your browser does not support the video tag. 案例:小台灯 功能:按下按钮后松开手,灯亮起5s后才会灭 工作原理 你可以从配置项的3种模式中任选1个: 保持直到改变:输入将会被保持,直到有另一个输入进来(例如一张伤

  • HTTP协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包括cookie、session,会话一般指session对象 使用cookie,所有数据存储在客户端,注意不要存储敏感信息 推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储sessio

  • null 我能找到的使用JPA/Hibernate的唯一有效解决方案是执行以下步骤。这是因为hibernate将实体保留在第一级缓存中,直到事务结束。 创建新实体 强制快速刷新() 分离实体 这样做的开销是 null 使用JDBC或JdbcTemplate,但您必须为实体编写自己的插入 所以问题是:是否存在同时坚持和分离的可能性,或者甚至更好地坚持而不成为被管理的?

  • std::cout是std::ostream的一个实例。我可以在一个名为usr/include/c/7/iostream的文件中看到std::cout的声明: 而std::ostream由typedef std::basic\u ostream定义 此外,您似乎无法创建std::ostream的实例。请参阅此演示代码片段: 以下是编译器对上述代码段的抱怨: 问题来了,因为

  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。