计算机二级DELPHI函数:利用Delphi建立精确计数器

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论


  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的稳定性和易用性,在工业控制或实时检测等领域是一个比较完美的平台)

  2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛

  2009年全国计算机等级考试报名信息汇总

  2009年NCRE考试有新变化

  2009年全国计算机等级考试大纲

  2009年上半年全国计算机二级考试试题及答案

  2009年上半年全国计算机等级考试试题答案汇总

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答