這篇文章的標題行實際上只是我問題的一半(簡單的一半)。所以,我會回過頭來談談我想要做的事情。在std :: chrono時鐘之間施放time_points
用std::chrono
測量經過時間非常簡單。但是,到目前爲止,我還沒有看到任何「計時器」的實現可以完成秒錶的圈數。也就是說,當您想要開始跟蹤時間間隔時,請致電Timer.start()
,並且每次要錄製間隔時請致電Timer.tick()
。然後,在快速結束後,您可以回顧所記錄的時間間隔列表;也許是平均水平和1%的高位或什麼的。另外,因爲我使用了很多,我想任意詢問計時器自午夜以來已經過了多少微秒。
這個虛構類的構造函數的第一個任務是在內部設置午夜。最初,我是通過this的技術來做這個精彩的答案。當我去實現我的Timer
類的概念時,我意識到我想要使用high_resolution_clock
或steady_clock
(儘管system_clock
在我的平臺上使用了納秒間隔)。然後出現這個問題:如何設置chrono::steady_clock::time_point
到午夜?
只有system_clock
有to_time_t
和from_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_clock
或steady_clock
一個time_point
的值爲「今天午夜」 - 我可以轉換
system_clock::time_point
使用與不同的chrono
時鐘?
當然,我很樂意指出一個更好的方法來處理這一切,如果它仍然符合我上面的總體目標。
在此先感謝。 =)
一個複雜因素是system_clock可能每年跳兩次(DST)。 steady_clock不是。 –
啊是的。爲了我的目的,這個定時器永遠不會運行超過幾個小時。 – musasabi
我有時會在程序啓動時捕捉一個時間點。隨後的任何時間點都可以計算程序開始後的持續時間。這是合理的嗎?我相信啓動時間點可以用'掛鐘'時間捕獲。我認爲這將是一個簡單的模塊化算法,可以將所有單圈時間調整爲ms-since-midnight。 –