簡體   English   中英

在std :: chrono時鍾之間轉換time_points

[英]Casting time_points between std::chrono clocks

這篇文章的標題實際上只占我問題的一半(較簡單的一半)。 因此,我會退后一步來談論我要做什么。

使用std::chrono來測量經過時間非常容易。 但是,到目前為止,我還沒有看到任何“計時器”實現可以像秒表一樣運行。 也就是說,你叫Timer.start()當你要開始跟蹤時間間隔,並調用Timer.tick()要錄制的間隔每次。 然后,在快速填充結束后,您可以回顧一下記錄的時間間隔列表; 可能占平均值和1%的高點。

另外,因為我經常使用它,所以我想隨意問一下計時器,自午夜以來經過了多少微秒。

這個虛構類的構造函數的第一個任務是在內部設置午夜。 最初,我是通過這個出色答案中的技術來實現的。 當我去實現我的一個概念Timer類,不過,我意識到,我想請使用high_resolution_clocksteady_clock (即使system_clock我的平台上使用納秒的時間間隔)。 然后出現問題:如何將chrono::steady_clock::time_point為午夜?

只有system_clock已經to_time_tfrom_time_t ,並且,只要我可以告訴大家,這是的方式,來表達“今天午夜”的唯一途徑chrono理解。 就昨晚的所有閱讀而言,我找不到將system_clock::time_point轉換為steady_clock::time_point 我最近的嘗試是:

typedef std::conditional<std::chrono::high_resolution_clock::is_steady,
                         std::chrono::high_resolution_clock,
                         std::chrono::steady_clock>::type TimerClock;

TimerClock::time_point midnight;

chrono::system_clock::time_point current_time = chrono::system_clock::now();

time_t raw_time = chrono::system_clock::to_time_t(current_time);

tm *tm_midnight = localtime(&raw_time);
tm_midnight->tm_hour = 0;
tm_midnight->tm_min  = 0;
tm_midnight->tm_sec  = 0;

midnight = chrono::system_clock::from_time_t(mktime(tm_midnight));

但是很明顯那不會飛。 據我所知, chrono::time_point_cast旨在使您可以從同一時鍾類型訪問不同的分辨率。

這給我留下了兩條路線/問題:

  • 我可以直接將high_precision_clocksteady_clocktime_point的值設置為“今天午夜” steady_clock
  • 我可以將system_clock::time_point轉換為與其他chrono時鍾一起使用嗎?

而且,當然,如果能夠與上述總體目標保持一致,我很樂意指出一種更好的方法來處理所有這些問題。

提前致謝。 =)

計算系統時鍾的午夜。

在“同一時間”(大約)上獲得系統時鍾和您想要的午夜時鍾的時間點。 將此時間稱為X。

將午夜的間隔轉換為系統時鍾上的X。 轉換為以皮秒為單位的持續時間(或任何分辨率)。

現在,您有了從午夜起以皮秒為單位的時間,該時間是您希望午夜開始的時鍾X的時間點。

請注意,這基本上是近似值,因為“時間X”將與系統時鍾和您關心的時鍾相隔一行。 但這只會相差大約一個時間來計算時間戳。 如果您真的很在意,可以執行兩個系統時鍾采樣來制動目標時鍾,並平均自午夜以來的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM