📄 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 + -