2012-02-09 4 views
0

Есть ли секундомер класса (предпочтительно с открытым исходным кодом), предоставляющий ту же услугу, что и Diagnostics.TStopwatch в Delphi XE?Секундомер для Delphi 2007

+2

Попробуйте http://delphi.about.com/od/windowsshellapi/a/delphi-high-performance-timer-tstopwatch.htm – RRUZ

+0

@RRUZ: Очень хороший ресурс, но я не уверен в его статусе лицензии. Я могу принять его как aswer, если вы его перенести. – menjaraz

+0

Вы можете запросить Zarko непосредственно по использованию лицензии, но я не думаю, что у этого кода есть какие-либо ограничения. – RRUZ

ответ

1

Мое предпочтение идет к 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 рекомендованных в нити комментария в вопросе.

2

Я понимаю, что это низкотехнологичный, но функция 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; 
+0

Я использую несколько иной алгоритм для вычисления прошедшего времени: 'function TimerElapsed (tick1, tick2: DWORD): DWORD; начало если tick2> = tick1, то {таймер перевертывания} Результат: = (tick2 - tick1) {normal} else Результат: = (MAXDWORD - tick1) + tick2; {расчет опрокидывания} end; ' –

+0

Я думаю, что MAXDWORD-tick1 и NOT tick1 будут делать то же самое. Оба делают дополнение 1s (логическое NOT). –

Смежные вопросы