如何取得系統開機時間(含開機後時間被調整) |
缺席
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
站內有許多文章,可以知道開機後到目前的時間,如這篇:請問如何偵測開機時間有多久了!!
使用 GetTickCount() 可以反推回系統開機時間。 另外由網路找到 http://www.vckbase.com/bbs/prime/viewprime.asp?id=348 使用 NtQuerySystemInformation() 取得系統開機時間,這函式也是 [發表] StatPlus v2.3.7.218 新增強迫休息,修正2G以上記憶體顯示,只用INI... 用來計算 CPU Loading 的函式。 我的狀況是,程式長時間運行不關機,程式會每 0.5 秒記錄資料(包含系統時間) 到資料檔,而在運行幾天後,偶而會發生 1 分鐘左右的空白,例如記錄的時間: 01:20:11.0 01:20:11.5 01:21:12.0 01:21:12.5 以上在 01:20:11.5 ~ 01:21:12.0 之間的資料沒記錄到。 當然資料沒記錄到,可能是 CPU 太忙或是程式發生異常。 不過,因為我是記錄生產機台的運作記錄,每批貨的生產時間不會差異太大, 例如,每批貨的生產開始到結束約 2 分鐘,以 0.5 秒一筆資料來算,每批貨約 240 筆資料。 在發生 1 分鐘空白時,所記錄到的那批貨,生產時間變成 3 分鐘,而空白的那 1 分鐘,完全沒有任何資料,而那批貨有記錄的資料筆數也約略是 240 筆。 也因為是這樣的狀況,讓我排除是 CPU 太忙或是程式異常,因為由記錄的資料筆數 來看,似乎那空白的 1 分鐘是其他程式或系統或是人為所造成的結果。 但... 問題來了,我要如何證明呢? 目前系統還是持續運作中,由 NtQuerySystemInformation() 取得開機時間, 用 目前時間 - 開機時間 再把它換算成 ms 再與 GetTickCount() 作比較,看看 是否系統時間有被調動。 但很不幸的是,這個 NtQuerySystemInformation() 所取得的開機時間, 似乎也是由 GetTickCount() 去換算出來的,導致我還是無法知道,是否系統時間 有被調整了。 如附件,執行後,GetTickCount 右邊的數值(單位 ms),是 (目前時間 - 開機時間)以 ms 為單位 再減去 GetTickCount 目前的數值。 PerformanceCount 是實驗用的,但似乎不能用於所有電腦。 使用附件,執行後,若作時間的修改,可以很容易發現,但問題是, 在修改時間後,把它關閉再重新執行,就會發生,它開機時間變了, 因為它的開機時間是用 NtQuerySystemInformation() 取得的。 所以,我的問題就是想看是否有 API 可以取得系統開機時間,不受 開機後時間被修改的問題。還有,Windows 系統有什麼狀況是會 「系統自動」作時間調整? P.S.1 我已關閉 Windows 時間自動校正的功能。 P.S.2 當然,之後我會在我的程式一啟動就記錄開機時間,就可以知道 是否時間有被修改了。 --------------------------- 2007-11-28 更新 Monitor Clock 程式。 按下表格的左上角可以將資訊複製到剪貼簿,每一項說明如下: 系統啟動時間 :系統啟動的時間 目前系統時間 :目前系統的時間 GetTickCount :使用 GetTickCount 的讀值(單位 ms) GetTickCount差值 :GetTickCount 減去 ((目前時間-啟動時間)換算成 ms) PerformanceCount(ms):QueryPerformanceCounter / QueryPerformanceFrequency 換算成單位為 ms 與 GetTickCount 作比較。 PerformanceCount差值:PerformanceCount(ms) 減去 ((目前時間-啟動時間)換算成 ms) PerformanceCount Raw:使用 QueryPerformanceCounter 的讀值 PerformanceFrequency:使用 QueryPerformanceFrequency 的讀值 請下載執行看看,是否您的 GetTickCount 差值與 PerformanceCount差值 是相近的,如果是差值太大,如: 系統啟動時間 :2007-11-28 12:18:54.000 目前系統時間 :2007-11-28 13:11:39.906 GetTickCount : 3,165,453.000 GetTickCount差值 : -453.000 PerformanceCount(ms): 3,050,324.644 PerformanceCount差值: -115,581.356 <-- 此數值太大(正或負太大都算) PerformanceCount Raw: 10,918,774,329 PerformanceFrequency: 3,579,545 可否提供您的主機板、作業系統等資料給我參考,感激不盡... ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com 編輯記錄
dllee 重新編輯於 2007-11-28 14:03:54, 註解 修定 Monitor Clock 工具‧
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
自行了結了
應該是只要開機後如果有人或程式調整了時間,就無法取得真正的系統開機時間, 此外,如果電腦系統的 GetTickCount 是不準的話,那就算沒人或程式調整過時間, 也無法取得正確的開機時間。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |