欢迎来到入门教程网!

Delphi

当前位置:主页 > 软件编程 > Delphi >

Delphi实现毫秒级别的倒计时实例代码

来源:本站原创|时间:2020-01-10|栏目:Delphi|点击:

本文以实例简述了Delphi实现毫秒级别倒计时的方法。一般来说可以获得系统的高性能频率计数器在一毫秒内的震动次数,如果时钟震动次数超过10毫秒的次数则刷新edit3的显示,显示从开始记数到记数实际经过的时间,具体实现代码如下:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls, mmsystem;
type
 TForm1 = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
  Button1: TButton;
  Button2: TButton;
  Timer1: TTimer;
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
  procedure Button2Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
 end;
var
 Form1: TForm1;
 acttime1,acttime2:cardinal;
 smmcount,stimercount,spcount:single;
 htimeid:integer;
 iten:integer;
 protimecallback:tfntimecallback;
 procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;
 procedure proendcount;
implementation
{$R *.DFM}
//timesetevent的回调函数
procedure proendcount;
begin
 acttime2:=gettickcount-acttime1;
 form1.button2.enabled :=false;
 form1.button1.enabled :=true;
 form1.timer1.enabled :=false;
 smmcount:=60;
 stimercount:=60;
 spcount:=-1;
 timekillevent(htimeid);
end;
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.

上一篇:Delphi实现窗口文字淡入淡出渐变效果的方法

栏    目:Delphi

下一篇:Delphi下OpenGL2d绘图之画线的方法

本文标题:Delphi实现毫秒级别的倒计时实例代码

本文地址:https://www.xiuzhanwang.com/a1/Delphi/8642.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有