?? exacttimer.pas
字號:
unit exacttimer;
interface
uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
stdctrls, extctrls, mmsystem;
type
tform1 = class(tform)
button1: tbutton;
button2: tbutton;
timer1: ttimer;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
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
uses XMconsts;
{$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
Self.Caption := GetAppTitle(44, True);
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; //設置Timer1的時間間隔為10毫秒
protimecallback := timeproc; //設置回調函數
htimeid := timesetevent(10, 0, protimecallback, 1, 1);
acttime1 := gettickcount; //獲得當前的Windows已運行毫秒數
queryperformancefrequency(lgper);
//獲得系統的高性能頻率計數器在一秒內的震動次數
ftemp := lgper / 1000; //獲得系統的高性能頻率計數器在一毫秒內的震動次數
iten := trunc(ftemp * 10);
queryperformancecounter(lgtick1); //獲得初始時的當前系統頻率計數器的震蕩次數
lgtick2 := lgtick1;
spcount := 60;
while spcount > 0 do
begin
queryperformancecounter(lgtick2);
if lgtick2 - lgtick1 > iten then
begin //如果時鐘震動次數超過10毫秒的次數則刷新edit3的顯示
lgtick1 := lgtick2;
spcount := spcount - 0.01; //60秒減去10毫秒
edit3.text := floattostr(spcount);
application.processmessages; //出讓CPU
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.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -