本文以實例簡述了Delphi實現毫秒級倒數的方法。一般來說可以獲得系統的高效能頻率計數器在一毫秒內的震動次數,如果時鐘震動次數超過10毫秒的次數則刷新edit3的顯示,顯示從開始記數到記數實際經過的時間,具體實現代碼如下:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, mmsystem;type TForm1 = class(TForm) Edit1: TEdit; Edit2: TE;type TForm1 = class(TForm) Edit1: TEdit; Edit2: TE;type TForm1 = class(TForm) Edit1: TEdit; Edit2: TE; : TButton; Timer1: TTimer; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Clicklicklick&D); { Public declarations } end;var Form1: TForm1; acttime1,acttime2:cardinal; smmcount,stimercount,spcount:single; htimeid:integer; iten:integer; protimecallback:tfntimecallback; procedure timeproc(utimerid, umessage: uint1dwuser, int1, dw, stdcall; procedure proendcount;implementation{$R *.DFM}//timesetevent的回呼函數procedure proendcount;begin acttime2:=gettickcount-acttime1; form1.button2.enabled :=false; form1.button1.enabled :=true; form1.timer1. :=false; smmcount:=60; stimercount:=60; spcount:=-1; timekillevent(htimeid);end;procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;begin form1.edit2.text:=floatto(strtextcount); smmcount:=smmcount-0.01;end;procedure TForm1.FormCreate(Sender: TObject);begin button1.caption :='開始倒數'; button2.caption :='結束倒數'; button2.enabled :=false; button1.enabled :=true; timer1.enabled timer1.alable; ; 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; 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 := lgtick1 > iten then begin 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; Sender: TObject);begin proendcount; //顯示從開始記數到記數實際經過的時間showmessage('實際經過時間'+inttostr(acttime2)+'毫秒');end;end.