GetTickCount 準嗎? |
缺席
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
最近我提了一個問題 : [問題] 如何取得系統開機時間(含開機後時間被調整)
在週六、週日兩天的測試後發現,系統時間似乎會自動調整?! 我使用的系統是 Mobile 的 CPU 不知道是否是因為這樣而有一些問題。 記錄時間 GetTickCount() 17:53:23 062 21,598,625 17:53:23 562 21,599,125 17:53:24 062 21,599,625 17:55:32 562 21,600,125 17:55:33 062 21,600,625 17:55:33 562 21,601,125 如上記錄,我們發現,在系統 IDLE 無法操作時,系統時間約每 1 小時被調快 2 分鐘。 而在系統有人操作時,則一切正常。 個人猜想是 GetTickCount() 不準!! 猜想可能原因是: Windows 系統以固定的 Timer 運行累加 GetTickCount() 取得的數值及系統時間。 在 Mobile 的系統 IDLE 時可能因為省電而降頻,GetTickCount 取得的數值就比正常慢。 而系統在固定週期去比較目前系統時間與 BIOS Real Time Clock 的時間差,如果差太多, 就自動校正。 但是,似乎找不到相關的資料可以佐證... 或許真實狀況與我猜想的不同... 不知道是否有人有經驗或是相關的資料可以提供參考? ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
在參考了msn上對此api的解說後,覺得你的推論應該是沒錯的。請參照下面:
1/ http://msdn2.microsoft.com/en-us/library/ms724408.aspx 2/ http://msdn2.microsoft.com/en-us/library/ms724394.aspx 其中第二個連結點是關於GetSystemTimeAdjustment Function。 希望這有一點點的幫助。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
感謝 aftcast 的回覆,我還以為沒人要理我了
GetSystemTimeAdjustment 我也試了,他執行的結果是它並沒有啟動 TimeAdjustment... 目前比較覺得怪的是,到底是那個程式修改了系統時間? Windows 系統會自行修改時間嗎? 主機版的 Driver 會自行修改時間嗎? 還是我的程式沒寫好或用了別人的元件,去修改了時間? 今天為了再確認,我先把我的程式關閉了,看看系統或其他運行的服務是會自行修改時間。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
感謝 Coffee 的回應,
我先在我的電腦試,把 Windows Time 服務關閉時,即使在日期時間中設定網路對時,也會收到 無法取得 RPC 伺服器 的錯誤訊息,所以,把它關閉,不會在日期時間中是否設定網路對時,都無法網路對時了。 謝謝您提供的訊息。 昨天,我把我的系統關閉,只留下 Monitor Clock (MonitorClock.zip),結果... 竟然跑了18小時只差10多秒... 問題仍在確認中... ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
感謝 anyone 的回覆,我知道 QueryPerformanceCounter/Frequency 的 API,也有讀出作比較,只是在發生問題的那台電腦似乎無法使用。
請參考 [問題] 如何取得系統開機時間(含開機後時間被調整) 今天有貼上新版的 Monitor Clock 請大家幫我測試,謝謝。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
我使用中華電信的網路對時程式,在一開機,先使用它更新系統時間與標準時間同步,接著把它自動調整時間改成手動,也就是只利用它來查標準時間。
另外寫一個小程式,在啟動時,先以 GetTickCount 反推系統開機時間,再以 Timer 每秒讀取 系統時間, GetTickCount, QueryPerformanceFrequency, QueryPerformanceCounter 等數值,與前次數值作比較,若發現系統時間變化大於 1.5 秒,則另外作記錄,實測如下圖: http://img411.imageshack.us/my.php?image=00155504kl4.png http://img411.imageshack.us/my.php?image=00163411fy0.png http://img214.imageshack.us/my.php?image=00164038ft7.png http://img214.imageshack.us/my.php?image=00164434ej5.png 可以看到,在標準時間 16:40:38 時,系統時間已落後 145.699 秒。 測試程式發現在系統時間從 16:41:12 直接跳到 16:43:49,可以看到 GetTickCount 的差值正好 1,000 但系統時間卻被(不知名的程式?服務?驅動程式?)調快 2.5 分鐘了, 由標準時間 16:44:34 的貼圖可以看到,系統時間被調整後,與標準時間的差值變小了。 今天持續找相關資料,這篇 http://download.lenovo.com.cn/support/xiazaizx/BIOSsjcx/wqy2k06.html 對于使用當前時間(時鐘)進行日期處理的應用程序來說, 它所使用的電腦時鐘有三個:操作系統時鐘、BIOS時鐘和 硬件實時時鐘RTC(Real Time Clock)。 1) 操作系統時鐘在每次操作系統啟動時讀取BIOS時鐘獲得 初始值,隨后操作系統通過將系統計數器的值轉換為時 間數據來對它進行維護。操作系統啟動后,這兩個時鐘 互相獨立地進行工作。 2) BIOS時鐘在微機開機后才能運轉,其目的就是在微機剛 啟動時讀取硬件實時時鐘(RTC)的時間值再向操作系 統提供。 3) 硬件實時時鐘RTC依靠電腦主板上的獨立電源(紐扣電池) 供電,無論在開、關機狀態下它都在工作。 對于絕大部分應用程序經常使用的是操作系統時鐘。 目前這台電腦,好像就是系統時間愈來愈慢(但不是固定速度的慢,慢的速度似乎是浮動的),而不知道是什麼服務或是驅動程式,在偵測到系統時間與 BIOS 或 RTC 時間差太多時,就自動作了調整。 我想大部分的人都會認為系統不會去作時間的調整,只是目前我遇到的狀況,實在是不知道是那個程式或服務或驅動程式調了時間。 P.S. 以上測試中,我已經把 Windows Time 服務關閉了,同時,日期時間的網路對時也取消勾選了。有使用中華電信的網路對時程式,但是是切手動的模式,只用來查標準時間。使用中華電信查標準時間只是為了由電腦中就可以作貼圖,不然,就要用數位相機來拍時鐘與畫面,但使用時鐘又可能有時鐘時間不準的問題,所以,還是使用查標準時間的方式來進行。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
今天早上把昨天測試機(關閉所有對時機制及服務)的狀況讀回,發現時間還是有跳動:
Monitor Clock (2007-11-28) System Start Up Time : 2007-11-28 15:41:13.000 Current Time : 2007-11-28 15:54:14.805 GetTickCount : 781,312 PerformanceCounter : 1,842,848,840 ---- Current Time : 2007-11-28 16:43:49.828 GetTickCount : 3,600,468 PerformanceCounter : 9,522,432,349 Last Time : 2007-11-28 16:41:12.961 Last GetTickCount : 3,599,468 Last PerformanceCounter: 9,516,405,067 Time Shift Detected!! ---- Current Time : 2007-11-28 17:45:07.859 GetTickCount : 7,200,500 PerformanceCounter : 17,908,314,336 Last Time : 2007-11-28 17:43:48.859 Last GetTickCount : 7,199,500 Last PerformanceCounter: 17,904,734,715 Time Shift Detected!! ---- Current Time : 2007-11-28 23:46:16.859 GetTickCount : 28,800,500 PerformanceCounter : 67,641,317,592 Last Time : 2007-11-28 23:45:06.859 Last GetTickCount : 28,799,500 Last PerformanceCounter: 67,637,745,875 Time Shift Detected!! ---- Current Time : 2007-11-29 05:47:17.859 GetTickCount : 50,400,500 PerformanceCounter : 116,522,345,266 Last Time : 2007-11-29 05:46:15.859 Last GetTickCount : 50,399,500 Last PerformanceCounter: 116,518,771,079 Time Shift Detected!! ---- 以上可以發現一點與在客戶端的狀況一樣,感覺就是有一個以 1 小時為單位的 Timer,此 Timer 在發現系統時間與「真實」時間差大於 1 分鐘時,就會作一次調整。 第1次:由 2007-11-28 16:41:12.961 下一秒應該是 2007-11-28 16:41:13.961 變成 2007-11-28 16:43:49.828 第2次:由 2007-11-28 17:43:48.859 下一秒應該是 2007-11-28 17:43:49.859 變成 2007-11-28 17:45:07.859 第3次:由 2007-11-28 23:45:06.859 下一秒應該是 2007-11-28 23:45:07.859 變成 2007-11-28 23:46:16.859 第4次:由 2007-11-29 05:46:15.859 下一秒應該是 2007-11-29 05:46:16.859 變成 2007-11-29 05:47:17.859 此外,System Start Up Time : 2007-11-28 15:41:13.000 也正好是第一次時間跳動的整點差!! 問題是,「誰」調整了時間?那個「誰」是去那兒取得「真實」時間? 此測試系統在 第 1 次偵測到時間跳動時,我已把網路線拔除了,就算它內部有網路對時,也無法由網路查到時間,但是,時間還是跳動了,同時是往「標準」的時間跳。 系統真的不會自己跳時間嗎? ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
shunchia63
高階會員 發表:26 回覆:141 積分:198 註冊:2007-05-22 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
我需要再強調一下,當系統時間跳動時,就算不執行中華電信的對時,也關閉了 Windows 本身的網路對時,系統仍然會有時間跳動的。
下午我會再進行實驗,在安全模式下實驗。有結果會再向大家報告。 如果您知道系統時間是由那兒來?是否會自行調整? 或是有相關的資料連結,再麻煩提供給我參考,感激不盡... P.S. 我的 OS 是乾淨的,重灌完,即使在任何 Driver 都沒安裝的狀況下,也是會發生。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com
編輯記錄
dllee 重新編輯於 2007-11-29 12:59:47, 註解 無‧
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
自行了結了
以目前眼睛實測的結果是 GetTickCount 是不準的 !!!! 昨天盯著時間看,系統時間與 GetTickCount 是同步的,使用 TTimer 每秒觸發, GetTickCount 確實每次跳 1000,系統時間也每次跳 1 秒,但是真實的時間卻已過了 2~3 秒!!! 使用 如何取得系統開機時間(含開機後時間被調整) 的附件,就可以作實驗了。 如果您不能確定您的電腦 GetTickCount 準不準,又您需要在 GetTickCount 是準的系統中運作時, 可以使用 如何取得系統開機時間(含開機後時間被調整) 的附件作測試。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
explorer.exe 也關掉呢
===================引 用 dllee 文 章=================== 我需要再強調一下,當系統時間跳動時,就算不執行中華電信的對時,也關閉了 Windows 本身的網路對時,系統仍然會有時間跳動的。 下午我會再進行實驗,在安全模式下實驗。有結果會再向大家報告。 如果您知道系統時間是由那兒來?是否會自行調整? 或是有相關的資料連結,再麻煩提供給我參考,感激不盡... P.S. 我的 OS 是乾淨的,重灌完,即使在任何 Driver 都沒安裝的狀況下,也是會發生。 ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
~§~迷時師渡,悟了自渡~§~
編輯記錄
harpist 重新編輯於 2007-12-06 04:53:31, 註解 無‧
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
explorer.exe 也關掉.... 沒測到。
我們大部分在機台應用上,我的系統會取代 Explorer.exe 成為系統的 Shell。 但目前這位客戶的應用是希望我的系統只是單純的一個 AP,因為他們還要跑他們的程式,所以,還是希望要有 explorer.exe 目前這個問題,已準定 GetTickCount 是不準的,這個不準是 PC / BIOS 的問題,在原廠更新 BIOS 後,就 OK 了。希望這個怪問題,只有我會遇到... ■ VMASK - ViewMove Automation Software Kernel ■ VMIO-Server/SECS/GEM ■ dllee's blog ■ dllee's StatPlus ■
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |