2017-09-01 83 views
1

這篇文章的標題行實際上只是我問題的一半(簡單的一半)。所以,我會回過頭來談談我想要做的事情。在std :: chrono時鐘之間施放time_points

std::chrono測量經過時間非常簡單。但是,到目前爲止,我還沒有看到任何「計時器」的實現可以完成秒錶的圈數。也就是說,當您想要開始跟蹤時間間隔時,請致電Timer.start(),並且每次要錄製間隔時請致電Timer.tick()。然後,在快速結束後,您可以回顧所記錄的時間間隔列表;也許是平均水平和1%的高位或什麼的。另外,因爲我使用了很多,我想任意詢問計時器自午夜以來已經過了多少微秒。

這個虛構類的構造函數的第一個任務是在內部設置午夜。最初,我是通過this的技術來做這個精彩的答案。當我去實現我的Timer類的概念時,我意識到我想要使用high_resolution_clocksteady_clock(儘管system_clock在我的平臺上使用了納秒間隔)。然後出現這個問題:如何設置chrono::steady_clock::time_point到午夜?

只有system_clockto_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_clock一個time_point的值爲「今天午夜」
  • 我可以轉換system_clock::time_point使用與不同的chrono時鐘?

當然,我很樂意指出一個更好的方法來處理這一切,如果它仍然符合我上面的總體目標。

在此先感謝。 =)

+1

一個複雜因素是system_clock可能每年跳兩次(DST)。 steady_clock不是。 –

+0

啊是的。爲了我的目的,這個定時器永遠不會運行超過幾個小時。 – musasabi

+0

我有時會在程序啓動時捕捉一個時間點。隨後的任何時間點都可以計算程序開始後的持續時間。這是合理的嗎?我相信啓動時間點可以用'掛鐘'時間捕獲。我認爲這將是一個簡單的模塊化算法,可以將所有單圈時間調整爲ms-since-midnight。 –

回答

2

計算系統時鐘的午夜。

「同時」(大約)爲系統時鐘和想要午夜的時鐘獲取時間點。調用此時間點X.

將系統時鐘的時間間隔從午夜轉換爲X.轉換爲皮秒(或任何分辨率)的持續時間。

您現在有時間從午夜開始,時間爲X點,時間爲您想要的午夜時間。

請注意,這將基本上是近似的,因爲「時間X」將成爲系統時鐘和您關心的時鐘的分界線。但是它只會差別大約計算時間戳的時間。如果你真的在意,你可以做兩個系統時鐘樣本來提供目標時鐘,並平均自午夜以來的時間。

相關問題