知识大全 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相关参考
JavaSwing中三种事件处理方法的比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Swi
JavaSwing中三种事件处理方法之比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Swi
知识大全 Java Web开发Tomcat中三种部署项目的方法
JavaWeb开发Tomcat中三种部署项目的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Delphi中进行延时的4种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 挂起不占CPU
DELPHI高精度计时方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! //取毫秒级时间精度(
知识大全 51单片机汇编延时时间精确计算方法,小弟刚学51,不是很明白,麻烦大哥大姐帮帮忙,谢谢
51单片机汇编延时时间精确计算方法?,小弟刚学51,不是很明白,麻烦大哥大姐帮帮忙,谢谢!要精确定时的话还是不要用延时来做了,还是用定时器做精确定时吧如果非要用延时,那你得计算延时程序里每条指令的周期
(1)自主复制DNA序列(autonomouslyreplicatingDNAsequence,ARS):具有一段11-14bp的同源性很高的富含AT的共有序列及其上下游各200bp左右的区域是维持A
选用时间继电器时,应按下列要求: (1)根据系统的延时范围和精度选择时间继电器的系列和类型。在延时精度要求不高的场合一般可选用价格较低的JS7-A系列空气阻尼式时间继电器反之。对精度要求较高的场
选用时间继电器时,应按下列要求: (1)根据系统的延时范围和精度选择时间继电器的系列和类型。在延时精度要求不高的场合一般可选用价格较低的JS7-A系列空气阻尼式时间继电器反之。对精度要求较高的场
Java定时执行任务的三种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!