Delphi实现毫秒级别的倒计时实例代码
本文以实例简述了Delphi实现毫秒级别倒计时的方法。一般来说可以获得系统的高性能频率计数器在一毫秒内的震动次数,如果时钟震动次数超过10毫秒的次数则刷新edit3的显示,显示从开始记数到记数实际经过的时间,具体实现代码如下:
unitUnit1;
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;
procedureFormCreate(Sender:TObject);
procedureButton1Click(Sender:TObject);
procedureTimer1Timer(Sender:TObject);
procedureButton2Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form1:TForm1;
acttime1,acttime2:cardinal;
smmcount,stimercount,spcount:single;
htimeid:integer;
iten:integer;
protimecallback:tfntimecallback;
proceduretimeproc(utimerid,umessage:uint;dwuser,dw1,dw2:dword)stdcall;
procedureproendcount;
implementation
{$R*.DFM}
//timesetevent的回调函数
procedureproendcount;
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;
proceduretimeproc(utimerid,umessage:uint;dwuser,dw1,dw2:dword)stdcall;
begin
form1.edit2.text:=floattostr(smmcount);
smmcount:=smmcount-0.01;
end;
procedureTForm1.FormCreate(Sender:TObject);
begin
button1.caption:='开始倒计时';
button2.caption:='结束倒计时';
button2.enabled:=false;
button1.enabled:=true;
timer1.enabled:=false;
smmcount:=60;
stimercount:=60;
spcount:=60;
end;
procedureTForm1.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;
whilespcount>0do
begin
queryperformancecounter(lgtick2);
//如果时钟震动次数超过10毫秒的次数则刷新edit3的显示
iflgtick2-lgtick1>itenthen
begin
lgtick1:=lgtick2;
spcount:=spcount-0.01;
edit3.text:=floattostr(spcount);
application.processmessages;
end;
end;
end;
procedureTForm1.Timer1Timer(Sender:TObject);
begin
edit1.text:=floattostr(stimercount);
stimercount:=stimercount-0.01;
end;
procedureTForm1.Button2Click(Sender:TObject);
begin
proendcount;
//显示从开始记数到记数实际经过的时间
showmessage('实际经过时间'+inttostr(acttime2)+'毫秒');
end;
end.