線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4034
推到 Plurk!
推到 Facebook!

如何取得系統開機時間(含開機後時間被調整)

缺席
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-23 23:35:22 IP:59.105.xxx.xxx 訂閱
站內有許多文章,可以知道開機後到目前的時間,如這篇:請問如何偵測開機時間有多久了!!
使用 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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
編輯記錄
dllee 重新編輯於 2007-11-28 14:03:54, 註解 修定 Monitor Clock 工具‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-01 15:03:44 IP:220.134.xxx.xxx 訂閱
自行了結了 

應該是只要開機後如果有人或程式調整了時間,就無法取得真正的系統開機時間,
此外,如果電腦系統的 GetTickCount 是不準的話,那就算沒人或程式調整過時間,
也無法取得正確的開機時間。


VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
系統時間:2024-04-20 0:54:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!