知识大全 Delphi中三种延时方法及其定时精度分析

Posted 函数

篇首语:不要让世界改变你的微笑,用你的微笑改变世界。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi中三种延时方法及其定时精度分析相关的知识,希望对你有一定的参考价值。

Delphi中三种延时方法及其定时精度分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

在Delphi中 通常可以用以下三种方法来实现程序的延时 即TTtimer控件 Sleep函数 GetTickCount函数 但是其精度是各不相同的     一 三种方法的简单介绍     )TTtimer控件    TTtimer控件的实质是调用Windows API定时函数SetTimer和KillTimer来实现的 并简化了对WM_TIMER 消息的处理过程 通过设置OnTimer事件和Interval属性 我们可以很方便的产生一些简单的定时事件      )Sleep函数    Sleep函数用来使程序的执行延时给定的时间值 Sleep的调用形式为Sleep(milliseconds) 暂停当前的进程milliseconds毫秒 Sleep的实现方法其实也是调用Windows API的Sleep函数 例如     sleep( );    //延迟 毫秒    Sleep会引起程序停滞 如果你延迟的时间较长的话 你的程序将不能够响应延时期间的发生的其他消息 所以程序看起来好像暂时死机      )GetTickCount函数    在主程序中延时 为了达到延时和响应消息这两个目的 GetTickCount()构成的循环就是一种广为流传的方法 例如     procedure Delay(MSecs: Longint);  //延时函数 MSecs单位为毫秒(千分之 秒)  var  FirstTickCount Now: Longint;  begin  FirstTickCount := GetTickCount();  repeat  Application ProcessMessages;  Now := GetTickCount();  until (Now FirstTickCount >= MSecs) or (Now < FirstTickCount);  end;    二 高精度的微妙级性能计数器(high resolution performance counter)介绍    为了比较以上方法的精度 首先需要找到一个参考的定时器 在这里 我提供了两个参考的定时器 一是用单片机每隔 ms产生一个实时中断RTI 作为计数器 二是选用了一个高精度的微妙级性能计数器(参见 lt aspx 或者   )     )计数器的Delphi源代码      A high precision counter/timer  Retrieves time differences  downto microsec   Quick Reference:  THPCounter inherits from TComponent     Key Methods:  Start:    Starts the counter  Place this call just before the  code you want to measure     Read:     Reads the counter as a string  Place this call just  after the code you want to measure     ReadInt:  Reads the counter as an Int  Place this call just  after the code you want to measure        unit HPCounter;    interface    uses  SysUtils  WinTypes  WinProcs  Messages  Classes  Graphics  Controls   Forms  Dialogs  StdCtrls  ExtCtrls;    type  TInt  = TLargeInteger;  THPCounter = class(TComponent)  private  Frequency: TLargeInteger;  lpPerformanceCount : TLargeInteger;  lpPerformanceCount : TLargeInteger;  fAbout: string;  procedure SetAbout(Value: string);   Private declarations   public  constructor Create(AOwner: TComponent); override;  destructor Destroy; override;  procedure Start;  function Read: string;  function ReadInt: TLargeInteger;   Private declarations   published  property About: string read fAbout write SetAbout;   Published declarations   end;      procedure Register;    implementation    procedure Register;  begin  RegisterComponents( MAs Prod  [THPCounter]);  end;    constructor THPCounter Create(AOwner: TComponent);  begin  inherited Create(AOwner);  fAbout:=  Version    ® Mats Asplund  EMail:   Site:  ;  end;    destructor THPCounter Destroy;  begin  inherited Destroy;  end;    function THPCounter Read: string;  begin  QueryPerformanceCounter(TInt ((@lpPerformanceCount )^));  QueryPerformanceFrequency(TInt ((@Frequency)^));  Result:=IntToStr(Round(  * (lpPerformanceCount     lpPerformanceCount ) / Frequency));  end;    function THPCounter ReadInt: TLargeInteger;  begin  QueryPerformanceCounter(TInt ((@lpPerformanceCount )^));  QueryPerformanceFrequency(TInt ((@Frequency)^));  Result:=Round(  * (lpPerformanceCount     lpPerformanceCount ) / Frequency);  end;    procedure THPCounter SetAbout(Value: string);  begin  Exit;  end;    procedure THPCounter Start;  begin  QueryPerformanceCounter(TInt ((@lpPerformanceCount )^));  end;    end      )使用方法   unit Unit ;    interface    uses  Windows  Messages  SysUtils  Classes  Graphics  Controls  Forms  Dialogs   HPCounter  StdCtrls;    type  TForm  = class(TForm)  Button : TButton;  Edit : TEdit;  Label : TLabel;  Label : TLabel;  procedure Button Click(Sender: TObject);  private   Private declarations   public   Public declarations   end;    var  Form : TForm ;    implementation    $R * DFM    procedure TForm Button Click(Sender: TObject);  begin  Edit Text:=  ;  Application ProcessMessages;  with THPCounter Create(Self) do  begin  Start;  // Place code to measure here  Sleep( );  // Place code to measure here  Edit Text:=Read;  Free;  end;  end;    end     三 三种方法的精度比较    为了比较 采用以上 种方法 分别设置延时时间为 ms ms ms ms ms ms ms ms ms ms 循环次数为 次 得到实际的延时时间      )TTtimer控件    实际延时时间(ms)   ms            ms            ms            ms              ms            ms            ms    ms    ms    ms      )Sleep函数     ms            ms            ms               ms            ms            ms            ms    ms    ms    ms      )GetTickCount函数     ms            ms            ms            ms            ms            ms             ms      ms    ms    ms     可见 相对而言 Sleep的精度最高 尤其是在 ms以内的延时 只有sleep函数才能够做到 TTimer控件的定时精度最差 而且稳定性不好 波动很大 GetTickCount函数所能实现的最短延时为 ms左右 稳定性相对TTimer要好一些 cha138/Article/program/Delphi/201311/24673

相关参考

知识大全 Java Swing 中三种事件处理方法的比较

JavaSwing中三种事件处理方法的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Swi

知识大全 Java Swing 中三种事件处理方法之比较

JavaSwing中三种事件处理方法之比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Swi

知识大全 Java Web开发Tomcat中三种部署项目的方法

JavaWeb开发Tomcat中三种部署项目的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Delphi中进行延时的4种方法

Delphi中进行延时的4种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  挂起不占CPU 

知识大全 DELPHI高精度计时方法

DELPHI高精度计时方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //取毫秒级时间精度(

知识大全 51单片机汇编延时时间精确计算方法,小弟刚学51,不是很明白,麻烦大哥大姐帮帮忙,谢谢

51单片机汇编延时时间精确计算方法?,小弟刚学51,不是很明白,麻烦大哥大姐帮帮忙,谢谢!要精确定时的话还是不要用延时来做了,还是用定时器做精确定时吧如果非要用延时,那你得计算延时程序里每条指令的周期

分析中期染色体的三种功能元件及其作用。

(1)自主复制DNA序列(autonomouslyreplicatingDNAsequence,ARS):具有一段11-14bp的同源性很高的富含AT的共有序列及其上下游各200bp左右的区域是维持A

如何选用时间继电器?

  选用时间继电器时,应按下列要求:  (1)根据系统的延时范围和精度选择时间继电器的系列和类型。在延时精度要求不高的场合一般可选用价格较低的JS7-A系列空气阻尼式时间继电器反之。对精度要求较高的场

如何选用时间继电器?

  选用时间继电器时,应按下列要求:  (1)根据系统的延时范围和精度选择时间继电器的系列和类型。在延时精度要求不高的场合一般可选用价格较低的JS7-A系列空气阻尼式时间继电器反之。对精度要求较高的场

知识大全 Java定时执行任务的三种方法

Java定时执行任务的三种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!