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

GetTickCount 準嗎?

缺席
dllee
站務副站長


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-26 13:02:15 IP:220.134.xxx.xxx 訂閱
最近我提了一個問題 : [問題] 如何取得系統開機時間(含開機後時間被調整)

在週六、週日兩天的測試後發現,系統時間似乎會自動調整?!
我使用的系統是 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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-27 15:36:36 IP:60.248.xxx.xxx 訂閱
在參考了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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-27 23:17:19 IP:59.105.xxx.xxx 訂閱
感謝 aftcast 的回覆,我還以為沒人要理我了

GetSystemTimeAdjustment 我也試了,他執行的結果是它並沒有啟動 TimeAdjustment...
目前比較覺得怪的是,到底是那個程式修改了系統時間?
Windows 系統會自行修改時間嗎?
主機版的 Driver 會自行修改時間嗎?
還是我的程式沒寫好或用了別人的元件,去修改了時間?

今天為了再確認,我先把我的程式關閉了,看看系統或其他運行的服務是會自行修改時間。


VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-27 23:54:46 IP:211.74.xxx.xxx 訂閱
不好意思,API我不熟,不過..會不會是Windows Time這個服務?
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
dllee
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-28 09:23:23 IP:220.134.xxx.xxx 訂閱
感謝 Coffee 的回應,
我先在我的電腦試,把 Windows Time 服務關閉時,即使在日期時間中設定網路對時,也會收到
無法取得 RPC 伺服器
的錯誤訊息,所以,把它關閉,不會在日期時間中是否設定網路對時,都無法網路對時了。
謝謝您提供的訊息。

昨天,我把我的系統關閉,只留下 Monitor Clock (MonitorClock.zip),結果...
竟然跑了18小時只差10多秒... 問題仍在確認中...


VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-28 11:40:07 IP:59.127.xxx.xxx 未訂閱
根據我的了解GetTickCount是系統設定千分之一秒的精準度
所以一定有其些微的誤差
若要用高精密度的話,建議你可用QueryPerformanceCounter()
但要記得除以頻率
編輯記錄
anyone 重新編輯於 2007-11-28 11:42:27, 註解 無‧
dllee
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-28 14:06:15 IP:220.134.xxx.xxx 訂閱
感謝 anyone 的回覆,我知道 QueryPerformanceCounter/Frequency 的 API,也有讀出作比較,只是在發生問題的那台電腦似乎無法使用。
請參考 [問題] 如何取得系統開機時間(含開機後時間被調整)
今天有貼上新版的 Monitor Clock 請大家幫我測試,謝謝。


VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
dllee
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-11-28 21:38:43 IP:59.105.xxx.xxx 訂閱
我使用中華電信的網路對時程式,在一開機,先使用它更新系統時間與標準時間同步,接著把它自動調整時間改成手動,也就是只利用它來查標準時間。
另外寫一個小程式,在啟動時,先以 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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
dllee
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-11-29 10:27:36 IP:220.134.xxx.xxx 訂閱
今天早上把昨天測試機(關閉所有對時機制及服務)的狀況讀回,發現時間還是有跳動:

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 KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-11-29 12:44:05 IP:61.219.xxx.xxx 訂閱
我不知是否為  中華電信的網路對時程式   問題


之前用戶端也有此問題導致資料錯亂




把它
中華電信的網路對時程式 關掉後就沒在叫修了....

或許 你可以用乾淨的OS 試看看.可以釐清一些是否其它AP造成的
dllee
站務副站長


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-11-29 12:58:41 IP:220.134.xxx.xxx 訂閱
我需要再強調一下,當系統時間跳動時,就算不執行中華電信的對時,也關閉了 Windows 本身的網路對時,系統仍然會有時間跳動的。

下午我會再進行實驗,在安全模式下實驗。有結果會再向大家報告。
如果您知道系統時間是由那兒來?是否會自行調整?
或是有相關的資料連結,再麻煩提供給我參考,感激不盡...

P.S. 我的 OS 是乾淨的,重灌完,即使在任何 Driver 都沒安裝的狀況下,也是會發生。

VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
編輯記錄
dllee 重新編輯於 2007-11-29 12:59:47, 註解 無‧
dllee
站務副站長


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

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

以目前眼睛實測的結果是
GetTickCount 是不準的 !!!!

昨天盯著時間看,系統時間與 GetTickCount 是同步的,使用 TTimer 每秒觸發,
GetTickCount 確實每次跳 1000,系統時間也每次跳 1 秒,但是真實的時間卻已過了 2~3 秒!!!
使用 如何取得系統開機時間(含開機後時間被調整) 的附件,就可以作實驗了。
如果您不能確定您的電腦 GetTickCount 準不準,又您需要在 GetTickCount 是準的系統中運作時,
可以使用 如何取得系統開機時間(含開機後時間被調整) 的附件作測試。

VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
http://www.ViewMove.com
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-12-06 04:48:43 IP:59.105.xxx.xxx 未訂閱
explorer.exe 也關掉呢

===================引 用 dllee 文 章===================
我需要再強調一下,當系統時間跳動時,就算不執行中華電信的對時,也關閉了 Windows 本身的網路對時,系統仍然會有時間跳動的。

下午我會再進行實驗,在安全模式下實驗。有結果會再向大家報告。
如果您知道系統時間是由那兒來?是否會自行調整?
或是有相關的資料連結,再麻煩提供給我參考,感激不盡...

P.S. 我的 OS 是乾淨的,重灌完,即使在任何 Driver 都沒安裝的狀況下,也是會發生。

VMASK - ViewMove Automation Software KernelVMIO-Server/SECS/GEMdllee's blogdllee's StatPlus
------
~§~迷時師渡,悟了自渡~§~
編輯記錄
harpist 重新編輯於 2007-12-06 04:53:31, 註解 無‧
dllee
站務副站長


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-12-06 17:38:14 IP:220.134.xxx.xxx 訂閱
explorer.exe 也關掉.... 沒測到。
我們大部分在機台應用上,我的系統會取代 Explorer.exe 成為系統的 Shell。
但目前這位客戶的應用是希望我的系統只是單純的一個 AP,因為他們還要跑他們的程式,所以,還是希望要有 explorer.exe

目前這個問題,已準定 GetTickCount 是不準的,這個不準是 PC / BIOS 的問題,在原廠更新 BIOS 後,就 OK 了。希望這個怪問題,只有我會遇到...


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