This article briefly describes Delphi's method of implementing millisecond-level countdown with examples. Generally speaking, the number of vibrations of the system's high-performance frequency counter within one millisecond can be obtained. If the number of clock vibrations exceeds 10 milliseconds, the display of edit3 will be refreshed to display the actual elapsed time from the start of counting to the time of counting. The specific implementation code as follows:
unit Unit1;interfaceuses 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 callback function 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 :='Start countdown'; button2.caption :='End countdown'; 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; //Get the system's high-performance frequency counter at The number of vibrations in one millisecond queryperformancefrequency(lgper); ftemp:=lgper/1000; iten:=trunc(ftemp*10); queryperformancecounter(lgtick1); lgtick2:=lgtick1; spcount:=60; while spcount>0 do begin queryperformancecounter(lgtick2); //If the number of clock vibrations exceeds 10 milliseconds, refresh the display of 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; //Display the actual elapsed time from the start of counting to the count showmessage('actual elapsed time'+inttostr(acttime2)+'milliseconds');end;end.