在程式里,我使用的是
t1:=GetTickCount;
t2:=GetTickCount;
r1:=t2-t1;
還用了一個timer,來計時,控制5秒時間,按下一個按鈕,計時開始,但是從開始到5秒結束記錄下的時間有超過5000毫秒,這是為什么啊?
uj5u.com熱心網友回復:
沒太看懂你要表達啥,貼ontimer里的代碼吧
uj5u.com熱心網友回復:
Timer必然不準啊.Timer是每隔Interval的時間發一個WM_Timer訊息的.而訊息在訊息佇列中排隊,一個一個處理,WM_Timer訊息被處理的時間要看前面訊息多少,每個訊息處理的時間長短.
uj5u.com熱心網友回復:
系統滴答時間是準的,關鍵是timer 不是name精確的, 所以不可能那么干嗎等于5000 msuj5u.com熱心網友回復:
starttime:=now();stoptime := Now();
r1 := MilliSecondsBetween(stoptime, starttime); //取得計時時間,單位毫秒(ms)
StatusBar1.Panels.Items[2].Text := '本次查詢耗時:' + inttostr(r1) + '毫秒';
uj5u.com熱心網友回復:
樓上方法不錯,標記uj5u.com熱心網友回復:
1)GetTickCount 即使精度不夠。2)timer 定時器的精度也不夠。
3)超過5000毫秒,才是正常的,恰好=5000的幾率非常小,不夠不會結束計時,只能是大部分時候,都是超過了5000毫秒的了。
uj5u.com熱心網友回復:
使用多媒體計時器 timesetevent,可以獲得毫秒級的精度uj5u.com熱心網友回復:
系統時鐘每秒計時約為18.2次 1000/18.2 約為55 ms 即定時器的計時間隔大約是55 ms,再小一點的話,只不過連續計時幾次而已,不可能用定時器精確計時的。timeGetTime 可以精確到毫秒,再精確的話,就要在驅動程式里計時了。
而精確計算時間間隔,也比較麻煩。大約要用到RTSC指令。
或者
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount // pointer to counter value
);
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount // pointer to counter value
);
等函式。
uj5u.com熱心網友回復:
http://www.cnblogs.com/sifenkesi/archive/2011/06/01/2065673.html可以參考一下
uj5u.com熱心網友回復:
uses Windows;
var
i1,i2:Int64;
diff,cc:Int64;
b:Boolean;
begin
QueryPerformanceCounter(i1);
...
...
QueryPerformanceCounter(i2);
diff := i2 - i1;
b := QueryPerformanceFrequency(cc); // WINDOWS API 回傳計數頻率(Intel86:1193180)(獲得系統的高性能頻率計數器在一毫秒內的震動次數)
if not b then cc := 1; // false表示不支持高性能定時器
Result := Round(diff * 1000 / cc); // ms
end;
uj5u.com熱心網友回復:
請用多媒體定時器,PC里可以達到1MS級別定時uj5u.com熱心網友回復:
Label3.Caption :=FormatFloat('0',(AWorkCount-lastc)/MilliSecondsBetween(now, lastt))+'kb/s';sProgressBar2.Position:=AWorkCount;
lastc:=AWorkCount; //用ProgressBar1.Position做lastc也可以
//smemo1.Lines.Add(MilliSecondsBetween(now, lastt).ToString());
lastt:=now;
uj5u.com熱心網友回復:
2013年的帖子.....轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74568.html
標籤:語言基礎/算法/系統設計
