⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exacttimer.pas

📁 计时器
💻 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 + -