Есть ли секундомер класса (предпочтительно с открытым исходным кодом), предоставляющий ту же услугу, что и Diagnostics.TStopwatch
в Delphi XE?Секундомер для Delphi 2007
ответ
Мое предпочтение идет к this (TStopUhr) реализации найденного в Delphi Praxis форуме.
Выдержка: образец
type
TStopUhr = class
private
FStoppedTime : Int64;
FStartValue : Int64;
FStopValue : Int64;
FStartTime : TDateTime;
FStopTime : TDateTime;
FMethode : TStopUhrMethode;
FMethodeInUse : TStopUhrMethode;
protected
function GetStoppedTimeStr: String;
public
Constructor Create;
Destructor Destroy; Override;
procedure Start;
procedure Stop;
property StartTime : TDateTime read FStartTime;
property StopTime : TDateTime read FStopTime;
property StoppedTime : Int64 read FStoppedTime;
property StoppedTimeStr : String read GetStoppedTimeStr;
property MeasureMethode : TStopUhrMethode Read FMethode Write FMethode;
end;
Использования:
var
StopUhr : TStopUhr;
begin
StopUhr := TStopUhr.Create;
StopUhr.MeasureMethode := su_TickCount; // default = su_DateTime
StopUhr.Start;
// zu messende Aufgabe
StopUhr.Stop;
ShowMessage(StopUhr.StoppedTimeStr);
StopUhr.Free;
end;
Он предоставляет аналогичные функциональные возможности какого RRUZ рекомендованных в нити комментария в вопросе.
Я понимаю, что это низкотехнологичный, но функция Win32 API GetTickCount
работает достаточно хорошо для меня. На большинстве ПК разрешение составляет около 15-20 миллисекунд.
Я использую его, как это, без каких-либо классов, но вы могли бы легко написать свой собственный класс:
function TimerElapsed(tick1,tick2:DWORD):DWORD;
begin
if ((tick2-tick1) < $80000000) then { timer roll-over check }
result := (tick2 - tick1) { normal }
else
result := (not tick1)+tick2; {rollover calculation}
end;
function TimingDemo:Cardinal;
var
time1,time2:Cardinal;
begin
time1 := GetTickCount;
DoSomethingSlow;
time2 := GetTickCount;
result := TimerElapsed(time1,time2); // return elapsed mSec.
end;
Я использую несколько иной алгоритм для вычисления прошедшего времени: 'function TimerElapsed (tick1, tick2: DWORD): DWORD; начало если tick2> = tick1, то {таймер перевертывания} Результат: = (tick2 - tick1) {normal} else Результат: = (MAXDWORD - tick1) + tick2; {расчет опрокидывания} end; ' –
Я думаю, что MAXDWORD-tick1 и NOT tick1 будут делать то же самое. Оба делают дополнение 1s (логическое NOT). –
Попробуйте http://delphi.about.com/od/windowsshellapi/a/delphi-high-performance-timer-tstopwatch.htm – RRUZ
@RRUZ: Очень хороший ресурс, но я не уверен в его статусе лицензии. Я могу принять его как aswer, если вы его перенести. – menjaraz
Вы можете запросить Zarko непосредственно по использованию лицензии, но я не думаю, что у этого кода есть какие-либо ограничения. – RRUZ