В этой статье кратко описывается метод Delphi для реализации обратного отсчета на уровне миллисекунд с примерами. Вообще говоря, можно получить количество вибраций высокопроизводительного частотомера системы в пределах одной миллисекунды. Если количество вибраций часов превышает 10 миллисекунд, дисплей edit3 обновится, чтобы отобразить фактическое время, прошедшее с начала отсчета. ко времени подсчета. Конкретный код реализации выглядит следующим образом:
модуль Unit1;интерфейсы, SysUtils, классы, графика, элементы управления, формы, диалоги, ExtCtrls, StdCtrls, mmsystem;тип TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit Button1: TButton; : TButton; TTimer1: TLabel2: TLabel; Label3: TLabel; процедура FormCreate (Отправитель: TObject); процедура Button1Click (Отправитель: TObject); процедура Timer1Timer (Отправитель: TObject); вар Form1: TForm1, acttime2: кардинальный, стимеркол, spcount: сингл; htimeid:integer; iten:integer; protimecallback:tfntimecallback; процедура timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall; начать acttime2:=getticcount-acttime1; form1.button2.enabled:=false; form1.button1.enabled:=true; form1.timer1.enabled:=false; smmcount:=60; spcount:=-1; timekillevent(htimeid);end; процедура 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 :='Начать обратный отсчет' button2.caption; :='Конец обратного отсчета'; button2.enabled :=false; button1.enabled :=true; timer1.enabled:=false; smmcount:=60; stimercount:=60;end;procedure TForm1.Button1Click(Sender: TObject);var lgtick1,lgtick2,lgper:tlargeinteger;ftemp:single;begin button2. включено: = истина; кнопка1.включено: = ложь; timer1.enabled :=true; timer1.interval :=10; protimecallback:=timeproc; htimeid:=timesetevent(10,0,protimecallback,1,1); acttime1:=gettickcount; //Получение высокопроизводительного счетчика частоты; at Число вибраций за одну миллисекунду query Performance Frequency(lgper):=lgper/1000; iten:=trunc(ftemp*10); query Performancecounter(lgtick1); lgtick2:=lgtick1; spcount:=60; while spcount>0 do Begin query Performancecounter(lgtick2); //Если количество колебаний часов превышает 10 миллисекунд, обновите отображение edit3, если lgtick2 - lgtick1 > iten then; начать lgtick1: = lgtick2: = spcount - 0,01; floattostr(spcount); application.processmessages; end; end;end;procedure TForm1.Timer1Timer(Sender: TObject);begin edit1.text := floattostr(stimercount); end;procedure TForm1.Button2Click( Отправитель: TObject);begin proendcount; //Отображение фактического времени, прошедшего от начала отсчета до момента подсчета showmessage('фактическое прошедшее время'+inttostr(acttime2)+'миллисекунды');end;end.