procedure TimeProc(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD) stdcall;
begin
Form1.Edit2.Text:=FloatToStr(smmCount);
smmCount:=smmCount-0.01;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption :=\’开始倒计时\’;
Button2.Caption :=\’结束倒计时\’;
Button2.Enabled :=False;
Button1.Enabled :=True;
Timer1.Enabled :=False;
smmCount:=60;
sTimerCount:=60;
sPCount:=60;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
lgTick1,lgTick2,lgPer:TLargeInteger;
fTemp:Single;
begin
Button2.Enabled :=True;
Button1.Enabled :=False;
Timer1.Enabled :=True;
Timer1.Interval :=10;
proTimeCallback:=TimeProc;
hTimeID:=timeSetEvent(10,0,proTimeCallback,1,1);
actTime1:=GetTickCount;
//获得系统的高性能频率计数器在一毫秒内的震动次数
QueryPerformanceFrequency(lgPer);
fTemp:=lgPer/1000;
iTen:=Trunc(fTemp*10);
QueryPerformanceCounter(lgTick1);
lgTick2:=lgTick1;
sPCount:=60;
while sPCount>0 do begin
QueryPerformanceCounter(lgTick2);
//如果时钟震动次数超过10毫秒的次数则刷新Edit3的显示
If lgTick2 - lgTick1 > iTen Then begin
lgTick1 := lgTick2;
sPCount := sPCount - 0.01;
Edit3.Text := FloatToStr(sPCount);
Application.ProcessMessages;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text := FloatToStr(sTimerCount);
sTimerCount:=sTimerCount-0.01;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
proEndCount;
//显示从开始记数到记数实际经过的时间
ShowMessage(\’实际经过时间\’+IntToStr(actTime2)+\’毫秒\’);
end;
end.
运行程序,点击“开始倒记时”按钮,程序开始60秒倒记时,由于上面的程序只涉及了记时器程序的原理而没有将错误处理加入其中,所以不要等60秒倒记时结束。点击“结束倒记时”按钮可以结束倒记时。这时在弹出对话框中会显示实际经过的时间(单位为毫秒),将三个文本框内的时间乘以1000再加上实际经过的时间,越接近60000,则记时精度越高。
下面是在我的机器上的执行结果。
从上面的结果看,由Delphi的Timer控件建立的记时器的精度十分差,无法在实际中使用,而利用高性能频率记数法和多媒体计数器法的误差都在1%以下。考虑到程序中在文本框中显示时间对程序所造成的影响,这个误差在应用中是完全可以忽略的。
另外在运行程序时作者还发现一个问题,如果在倒记时时拖动窗口,文本框中的显示都会停止,而当停止窗口拖放后,多媒体记时器显示会跳过这段时间记时,而其它两种记时器显示倒记时却还是从原来的时间倒数。这说明多媒体记时器是在独立的线程中运行的,不会受到程序的影响。
综合上面的介绍和范例,我们可以看到,如果要建立高精度的记时器,使用多媒体记时器是比较好的选择。而高性能频率记数法比较适合计算某个耗时十分短的过程所消耗的时间(例如分析程序中某个被多次调用的程序段执行时间以优化程序),因为毕竟高性能频率记数的理论可以达到微秒级别。Timer控件虽然精度比上面两者差很多,但是它使用方便,在要求不高的场合它还是最佳选择。
(最后要说的是,以上的结果都是在Windows 9X下获得的,作者在Windows 2000下运行该程序时发现,Timer控件的精度比在Windows 9X下要高出很多,一般误差在5%以下,这说明Windows 2000是一个真正的多任务操作系统。再加上Windows NT\\2000的稳定性和易用性,在工业控制或实时检测等领域是一个比较完美的平台)
上一页 [1] [2]
责任编辑:小草