这个Timer问题真奇怪(50分)

  • 主题发起人 主题发起人 carnation
  • 开始时间 开始时间
C

carnation

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Timer中写了这么一段代码,大意是自己进行时间的累加
procedure TForm1.timerTimer(Sender: TObject);
begin
If not BeginTest then
begin
BeginTest:=true;
FirstTime:=Time;
end;

label1.Caption:=TimeToStr(Time-FirstTime);
ms:=ms+timer1.interval;
if ms>=1000 then
begin
ms:=0;
s:=s+1;
if s>=60 then
begin
s:=0;
m:=m+1;
end;
end;
edit1.text:=inttostr(m);
edit2.text:=inttostr(s);
edit3.text:=inttostr(ms);
end;
label1中是用Now来显示时间,而edit1,edit2,edit3是我自己累加时间
可当我执行后,如果Interval取100,过一会儿两个时间就不一样了
如果Interval取40,3秒就不一样了。
两个问题:
1.为什么Interval取100,两个时间还会不一样?我知道Timer控件的精度并不高,但
怎么说100ms的精度总该有吧。
2.这个例子我用其他第三方的Timer控件也试过,那些用线程写的控件,说明中能达到
1ms的精度,但实际上Interval取100,过一会儿两个时间仍然不一样。为什么?
 
timer 1 秒触发 18 次左右
 
timer 1 秒触发 18.2 次
这跟我的问题没有什么关系把
我可是取Interval 100ms也这样
 
用 timer 控件累加时间是不太精确
 
OnTimer事件调用是要等到程序空闲的.所以触发频率越高,同一时段累计误差越大.
最极端的例子:
OnTimer事件本身需要100毫秒,而Interval设为50,那么就惨了.
年前参加263网络运动会时,做了一个自动点鼠标的程序,频率设高了反而不行
 
To change:
你说的没错,问题是:那些第三方的控件精度可有1ms,而我只是100ms才触发一次,
而且,这些事情(做做累加)用不了100ms吧。
我发现:即使我在OnTimer中再写一些代码,时间仍然是这样
我还发现:误差是成比例的,比如标准时间走了1分钟,直接累加用了1.2分钟,
那么标准时间走5分钟时,直接累加就用了6分钟。

主要问题是:我希望每隔一定时间去采样,并绘图,采样间隔不能太短我理解
(就像LeeChange所说的),但我希望能准确些,比如说如果我的事件需要20ms,那我
希望当我将Interval设成40ms时,误差不要这么大。
 
每隔一定时间去采样,对于这样高精度的工业采样问题建议最好不用timer,
用一个用真循环即可,可以用sleep之类来延时。
不用timer的另一个原因是当cpu比较繁忙时(你可以做for循环测试)timer就
更不准了
 
请继续或结束
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
415
import
I
后退
顶部