timer控件的精度(100分)

  • 主题发起人 主题发起人 袁志军
  • 开始时间 开始时间

袁志军

Unregistered / Unconfirmed
GUEST, unregistred user!
请问timer控件的精度是多少?按道理说可以精确到1ms,
不知有谁试过没有,好像VC里达不到?
 
精度很差的, 我估计每1000ms差1~10ms
按照Windows的实现应该是以Time_Tick作为基数, 也就是说大约20ms的整数倍
还是比较可信(精确)的.
 
精度很差,误差不小。而且和CPU的占用有关。
以Time_Tick为准。
 
比较准确的是采用WINDOWS的时间脉冲,这个是以主板中的晶体的振荡频率来测定的。
 
一般Timer的精度都是1/18秒,更精确的定时需要使用多媒体定时器,或使用现成的控件。
如LMD控件组中的LMDHiTimer控件。
 
别用它 不是必要的话,精度太糟糕
 
精度很差,真的,,,
 
能达到 50ms 就很不错了。系统时中每秒调用 18.2 次,你可以算算最少时间是多少,
而且,由于 Timer 控件只是到了时间后发一条消息,而在系统忙的时候是不会立即响应的。
所以要求高精度的时候是不能用 Timer 控件的。
如果你不打算采用其它控件,我有一个简单的方法获得较准确的时间:
GetTickCount 获得 Windows 启动以来经过的时间,以毫秒为单位,这个时间是较准确
的。
var
t1,t2:longint;
n:integer;
begin
n:=1;

while n<30 do
begin
inc(n);
t2:=gettickcount;
t1:=t2;
while (t2-t1)<1000 do
begin
application.ProcessMessages;
t2:=gettickcount;
end;
beep;
end;
end;
采用本方法就是 CPU 占用率较高,你也可以结合 SLEEP 方法或线程的方法来解决。
 
精度和响应时间是不同的概念,Timer是定时器,不是计时器
 
TTimer控件在Win98中只能达到50ms的水平,在WinNT中则比较好,10ms也不成问题。
Win98中如果需要较短的间隔时间可以用 OnIdle 事件,然后用MMSystem.dll中的
TimeGetTime函数确定间隔时间这个函数的精度在Win98中可以达到1ms,在WinNT中
为5ms.
 

<font size="6" color="#FF0000">High Resolution Counter</font>

QueryPerformanceFrequency
The QueryPerformanceFrequency function retrieves the frequency of the
high-resolution performance counter, if one exists.

BOOL QueryPerformanceFrequency(
LARGE_INTEGER *lpFrequency // address of current frequency
);

Parameters
lpFrequency
Pointer to a variable that the function sets, in counts per second, to the
current performance-counter frequency. If the installed hardware does not
support a high-resolution performance counter, this parameter can be to zero.
Return Values
If the installed hardware supports a high-resolution performance counter,
the return value is nonzero.

If the installed hardware does not support a high-resolution performance
counter, the return value is zero.


QueryPerformanceCounter
The QueryPerformanceCounter function retrieves the current value of the
high-resolution performance counter, if one exists.

BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount // pointer to counter value
);

Parameters
lpPerformanceCount
Pointer to a variable that the function sets, in counts, to the current
performance-counter value. If the installed hardware does not support a
high-resolution performance counter, this parameter can be to zero.
Return Values
If the installed hardware supports a high-resolution performance counter,
the return value is nonzero.

If the installed hardware does not support a high-resolution performance
counter, the return value is zero.
 
至于有多High,只能自己试一试了!
(Zzz...据说可以到ns级_以下_)
 
hoho~~~~
参见http://urus.myetang.com/delphi/timer.htm
 
多人接受答案了。
 
后退
顶部