2010-04-06 20 views
2

我將在C/C++中開發一個小型專用服務器,這將需要永久運行。我一直在研究一些時間函數,因爲計算需要毫秒計時。我有2個問題,我面對:跨平臺毫秒計時器持續49天以上?

  1. 使用32位整數存儲的毫秒數自投產開始將在環繞約49天痕重置爲零。我曾考慮過使用64位整數,使用gettimeofday來檢索微秒,但這將我帶到第二部分。

  2. 似乎 有不被任何標準的系統調用用於獲取經過毫秒的平臺獨立的

我應該怎麼做,以解決這兩個問題?

+5

請原諒我,如果這是說明一個非常明顯的,但1)使用更多的位2)編寫一個系統依賴模塊,使任何時間的原始你最好的。 – msw 2010-04-06 13:55:10

+0

「需要永久運行」 - 即使重新啓動也不允許?怎麼樣在服務器上漏水或斷電? LOST的艙口會炸燬,世界結束了嗎? – 2010-04-06 14:44:49

+0

@Coronatus:更多的上下文:「一個C/C++服務器,將需要永遠的正常運行時間」。假如硬件沒有重新啓動/故障/隕石影響,硬件會變得任意長,那麼這個軟件還需要開發嗎?否則,你基本上說「這個軟件必須每X天重新啓動一次」,這顯然是一個不好的計劃。 – Cascabel 2010-04-06 15:11:41

回答

6
  1. 使用一個64位的整數,假設,讓你有足夠的時間

  2. 你是正確的;沒有標準。一種可能性是使用Boost DateTime庫,或者找到另一個或者自己推出。

祝你好運!

+0

+1用於Boost/DateTime參考。 ** boost :: posix_time :: ptime **是驚人的。你真的應該嘗試一下。 – ereOn 2010-04-06 14:11:20

+0

如果5億年不夠,可以使用128位整數 – BeB00 2017-07-10 17:44:49

0

明顯。使用具有平臺特定代碼的64位整數來獲取毫秒數。在包括OSX的Unix上,您需要gettimeofday。在Windows上,獲得可靠的毫秒級粒度時間源的好運氣;由於該地區存在一些邪惡陷阱,因此code in the Tcl library to do this確實很複雜。

0

答案1:如果「毫秒計時」你是測量是在20天左右,就可以減去時間無符號數,檢查結果作爲符號值。這應該給包裝定時器的正確結果(從0xffffffff包裝到0x00000000)。如果你的時間超過20天,你需要更多的位。

+0

24.85513480902777777777777777777_天將是最大可測量時間增量。 您通常可以對事物進行編碼,以避免計算這麼長的時間。永遠不要設置超過12天的計時器是一個好主意。另一種情況是,如果你確實需要記錄一個可能比這個時間更長的時間,那麼有一個標誌表明如果這個時間已經過去了。這裏老到的是,它至少和你可以信任的時間一樣長。 – nategoose 2010-04-06 18:11:47

+0

哇,很好的計算... – stefaanv 2010-04-06 18:57:39

2

正如前面已經說過,你要面對的第一個問題是要獲得可靠的毫秒精確的時間。

我承認我有點被這個問題分階段雖然。

我可以理解爲精確定時(毫秒級,甚至微秒),但在毫秒級定時50天似乎......奇怪的需要。

你或許應該先回顧一下你的需求,但它很少需要超過6個或7顯著數字......我怕你正在試圖獲得一個尺寸適合所有這些持續時間對象。

也許你應該改爲分類你的持續時間:

  • 最多幾分鐘>使用精確到毫秒
  • 否則>使用精確到秒(自1970年1月1日著名的計數)

因爲......在2個月的規模上,1/10秒的感覺是什麼?