`

Delphi中三种延时方法及其定时精度分析

阅读更多

Delphi中三种延时方法及其定时精度分析

选择自 listenwind 的 Blog

关键字 Delphi中三种延时方法及其定时精度分析
  在Delphi中,通常可以用以下三种方法来实现程序的延时,即TTtimer控件,Sleep函数,GetTickCount函数。但是其精度是各不相同的。
一、三种方法的简单介绍
1)TTtimer控件
  TTtimer控件的实质是调用WindowsAPI定时函数SetTimer和KillTimer来实现的,并简化了对WM_TIMER消息的处理过程。通过设置OnTimer事件和Interval属性,我们可以很方便的产生一些简单的定时事件。
2)Sleep函数
  Sleep函数用来使程序的执行延时给定的时间值。Sleep的调用形式为Sleep(milliseconds),暂停当前的进程milliseconds毫秒。Sleep的实现方法其实也是调用Windows API的Sleep函数。例如:
sleep(1000); //延迟1000毫秒
Sleep会引起程序停滞,如果你延迟的时间较长的话,你的程序将不能够响应延时期间的发生的其他消息,所以程序看起来好像暂时死机。
3)GetTickCount函数
  在主程序中延时,为了达到延时和响应消息这两个目的,GetTickCount()构成的循环就是一种广为流传的方法。例如:
procedure Delay(MSecs: Longint);
//延时函数,MSecs单位为毫秒(千分之1秒)
var
FirstTickCount, Now: Longint;
begin
FirstTickCount := GetTickCount();
repeat
Application.ProcessMessages;
Now := GetTickCount();
until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;
二、高精度的微妙级性能计数器(high-resolution performance counter)介绍
  为了比较以上方法的精度,首先需要找到一个参考的定时器。在这里,我提供了两个参考的定时器。一是用单片机每隔1.024ms产生一个实时中断 RTI,作为计数器;二是选用了一个高精度的微妙级性能计数器(参见:http: //msdn.microsoft.com/msdnmag/issues/04/03/HighResolutionTimer/default.aspx,或者 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200249
1)计数器的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 Int64. 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

TInt64 = TLargeInteger;

THPCounter = class(TComponent)

private

Frequency: TLargeInteger;

lpPerformanceCount1: TLargeInteger;

lpPerformanceCount2: 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 1.1, 2000?? Mats Asplund, EMail: masprod@telia.com, Site: http://go.to/masdp';
end;
destructor THPCounter.Destroy;
begin
inherited Destroy;
end;
function THPCounter.Read: string;
begin
QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));

QueryPerformanceFrequency(TInt64((@Frequency)^));

Result:=IntToStr(Round(1000000 * (lpPerformanceCount2 -

lpPerformanceCount1) / Frequency));

end;
function THPCounter.ReadInt: TLargeInteger;

begin

QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));

QueryPerformanceFrequency(TInt64((@Frequency)^));

Result:=Round(1000000 * (lpPerformanceCount2 -

lpPerformanceCount1) / Frequency);

end;
procedure THPCounter.SetAbout(Value: string);

begin

Exit;

end;
procedure THPCounter.Start;

begin

QueryPerformanceCounter(TInt64((@lpPerformanceCount1)^));

end;
end.
2)使用方法:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
HPCounter, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private

{ Private declarations }

public

{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);

begin

Edit1.Text:= '';

Application.ProcessMessages;

with THPCounter.Create(Self) do

begin

Start;

// Place code to measure here

Sleep(1000);

// Place code to measure here

Edit1.Text:=Read;

Free;

end;

end;
end.
二、三种方法的精度比较
  为了比较,采用以上3种方法,分别设置延时时间为1ms、2ms、5ms、10ms、20ms、50ms、100ms、200ms、500ms、1000ms,循环次数为5次,得到实际的延时时间。
1)TTtimer控件

实际延时时间(ms)

1ms: 8.012 21.551 6.875 21.647 9.809

2ms: 9.957 20.675 14.671 11.903 20.551

5ms: 9.952 20.605 9.924 20.705 12.682

10ms:14.852 9.96 21.547 9.82 20.634

20ms:27.512 34.291 26.427 31.244 30.398

50ms:61.196 61.307 64.027 62.048 63.059

100ms:102.495 108.408 112.318 110.322 102.531

200ms:193.955 202.135 207.016 205.082 202.194

500ms:496.659 500.534 503.398 495.551 500.394

1000ms:999.699 1003.576 993.698 1004.443 995.625

 

2)Sleep函数

 

1ms:  1.895  1.895   1.896   1.897  1.898

2ms:  2.868  2.874   2.852   2.872  2.869

5ms:  5.8   5.797   5.79   5.79   5.791

10ms: 10.675  10.683  10.611  10.669  10.67

20ms: 20.404  20.434  20.447  20.477  20.368

50ms: 50.67   50.691  50.69  50.682  50.671

100ms:100.515  100.469 100.484 100.481  100.484

200ms:200.101  200.126 199.892 200.066  200.108

500ms:499.961  499.961 499.958 499.961  499.96

1000ms:1000.034 1000.04 1000.03 1000.018 1000.029

 

3)GetTickCount函数


1ms: 15.54   15.596   15.527  15.566  15.838

2ms: 15.561   15.563  15.603   15.477  15.571

5ms: 15.519   15.549   15.569  15.666  15.394

10ms:15.558   15.561   15.522  15.568  15.518

20ms:31.186   31.137   31.17  31.17   31.19

50ms:62.445    62.4   63.893 60.88    62.404

100ms:109.276  109.298  109.273 109.28   109.28

200ms:203.027  203.084  203.021 203.027  203.046

500ms:499.959  499.961  499.963 499.967  499.965

1000ms:1000.023 1000.022 1000.026 1000.029 1000.021

  可见,相对而言,Sleep的精度最高,尤其是在10ms以内的延时,只有sleep函数才能够做到。TTimer控件的定时精度最差,而且稳定性不好,波动很大。GetTickCount函数所能实现的最短延时为15ms左右,稳定性相对TTimer要好一些。

 

 

/延时函数,MSecs单位为毫秒(千分之1秒
procedure Delay(MSecs: Longint);
//延时函数,MSecs单位为毫秒(千分之1秒)
var
  FirstTickCount, Now: Longint;
begin
  FirstTickCount := GetTickCount();
repeat
  Application.ProcessMessages;
  Now := GetTickCount();
until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;

分享到:
评论

相关推荐

    Delphi中三种延时方法

    ### Delphi中三种延时方法 在Delphi编程中,实现延时操作是常见的需求之一。这不仅可以用于控制程序执行的节奏,还可以帮助开发者更好地管理应用程序中的定时任务。本文将详细介绍Delphi中常用的三种延时方法:使用...

    delphi 精确延时 函数

    下面我们将深入探讨几种常用的 Delphi 精确延时函数及其原理。 1. **Sleep() 函数**: Sleep() 是 Windows API 中的一个函数,可以用来暂停当前线程的执行。它的参数以毫秒为单位指定延时时间。然而,Sleep() 并不...

    delphi延时函数(相当于sleep函数)

    在Delphi编程环境中,开发人员有时需要在程序执行过程中插入短暂的延时,以便实现某种等待效果或避免过于频繁的操作。传统的Windows API函数`Sleep()`常用于此目的,但使用`Sleep()`会阻塞应用程序的消息循环,导致...

    delphi 几个定时器方法的比较

    本文将探讨三种常见的定时器方法:系统定时器、SetEvent函数以及多媒体定时器,并进行详细比较。此外,我们还将讨论如何将多媒体定时器封装成类以供重复使用。 首先,让我们了解每种定时器的基本概念: 1. **系统...

    delphi 定时关机软件源代码 20100614

    在这个"delphi 定时关机软件源代码 20100614"中,我们可以深入理解如何利用Delphi来实现一个实用的定时关机功能。这个源代码提供了关于操作系统控制、时间管理以及用户界面设计等多个方面的编程知识。 首先,我们要...

    Delphi 定时开启关闭应用程序及任务

    在本话题中,我们将探讨如何利用Delphi实现定时开启和关闭应用程序,以及如何结合系统托盘功能来实现这些功能。这在日常任务自动化、后台服务监控等方面具有广泛的应用。 首先,让我们深入了解Delphi中的定时任务。...

    2000_Delphi最新三层源码_delphi三层架构_DELPHI三层_三层_源码

    7. **源码学习价值**:通过分析这个Delphi三层源码,开发者可以深入理解如何在实际项目中运用三层架构,如何组织和管理代码,以及如何在Delphi环境中设计和实现高效的数据访问和业务处理逻辑。 总之,"2000_Delphi...

    Delphi延时函数

    在Delphi编程环境中,延时函数是开发人员经常使用的工具,用于在程序执行流程中插入一个暂停,使得代码在一段时间后继续执行。...在实际项目中,根据需求选择合适的延时方法,是提高程序质量的关键。

    Delphi自制的高精度计时器(附带源码)

    在本文中,我们将深入探讨如何使用Delphi自制一个高精度计时器,它能够精确到毫秒级别。Delphi是一款强大的面向对象的编程环境,基于Pascal语言,它提供了丰富的库和工具,使得开发高性能的应用程序变得相对简单。...

    Delphi高精度计时方法

    //取毫秒级时间精度(方法一):  var  t1,t2:int64;  r1:int64;  begin  t1:=GetTickCount;//获取开始计数 WINDOWS API  sleep(1000);{do...}//执行要计时的代码  t2:=GetTickCount;//获取结束...

    delphi 第三方组件安装方法

    在Delphi编程环境中,第三方组件是开发者们拓展功能、提高效率的重要工具。这些组件通常由除了BORLAND(现为Embarcadero)之外的开发者或公司提供,它们丰富了Delphi的标准组件库,使得开发者可以构建更加复杂和定制...

    Delphi定时关机程序

    Delphi定时关机程序是一种利用Delphi编程语言开发的应用,其主要功能是在用户设定的时间点自动关闭计算机。Delphi是Borland公司(现Embarcadero Technologies)推出的一种基于对象 Pascal语言的集成开发环境(IDE)...

    delphi 定时关机

    Delphi是一种基于Object Pascal语言的集成开发环境(IDE),它由Embarcadero Technologies公司开发,主要用于构建Windows桌面应用程序。本项目是一个使用Delphi编写的定时关机程序,旨在为用户提供方便的自动化关机...

    DELPHI定时运行指定程序源代码

    DELPHI定时运行指定程序源代码是一个实用的开发示例,它展示了如何在Delphi编程环境中构建一个应用程序,该程序能够按照预设的时间间隔自动启动其他可执行文件(EXE)。这个程序对于需要定期执行某些任务,如系统...

    Delphi音乐频谱分析

    本示例是使用Delphi编程语言实现的一个音乐频谱分析Demo,它可以帮助开发者理解如何在Delphi环境中进行音频信号的处理和可视化。Delphi,作为一款强大的RAD(快速应用开发)工具,以其高效的编译器和丰富的组件库,...

    Delphi 定时关机源码

    在这个特定的案例中,"Delphi 定时关机源码"是指使用Delphi编程语言编写的源代码,该源代码实现了计算机定时关机的功能。下面将详细讨论这个主题涉及到的知识点。 1. **Delphi编程环境**: Delphi是Embarcadero ...

    Delphi 定时提醒小闹钟

    在这个"Delphi 定时提醒小闹钟"项目中,我们将探讨如何使用Delphi来开发一个实用的定时提醒应用程序,类似于日常生活中的小闹钟。 首先,我们需要了解Delphi的开发环境。在Delphi中,开发者可以使用可视化组件库...

    迅雷下载软件启动、任务自动定时控制器Delphi源码版..rar

    Delphi支持这两种方式,源码中会包含如何创建接口对象、调用相应方法的代码。 5. **配置管理**:定时任务通常需要保存用户的设定,比如定时时间、任务列表等。Delphi提供了多种方式进行数据存储,如.INI文件、XML...

    定时自动关闭的对话框或消息框【Delphi】.rar

    在 Delphi 编程环境中,有时我们希望创建的对话框或消息框能在用户不进行任何操作的情况下自动关闭,以提供更好的用户体验。这个“定时自动关闭的对话框或消息框【Delphi】”示例就提供了这样的功能。它利用 Delphi ...

    DELPHI 做的定时器

    在DELPHI中,TTimer组件是实现定时功能的核心。 TTimer组件位于VCL(Visual Component Library)的Controls包中,可以在设计时直接拖放到窗体上。TTimer组件有两个主要属性:Interval和OnTimer事件。 1. **...

Global site tag (gtag.js) - Google Analytics