- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
unit HRTimer;
interface
uses Windows;
type
// --------------------- Класс - высокоточный таймер -------------------------
THRTimer = class(TObject)
constructor Create;
function StartTimer: Boolean; // Обнуление таймера
function ReadTimer: Double; // Чтение значения таймера в миллисекундах
private
StartTime: Double;
ClockRate: Double;
public
Exists: Boolean; // Флаг успешного создания таймера
end;
var
Timer: THRTimer; // Глобальая переменная. Создаётся при запуске программы
{ Фукнция высокоточной задержки.
Delphi:
Синтаксис: function HRDelay(const Milliseconds: Double): Double;
Milliseconds: Double - задержка в миллисекундах (может быть дробной)
Результат функции - фактически произошедшая задержка с погрешностью.
Пример вызова функции: X:= HRDelay(100.0); или HRDelay(100.0);
C++Builder:
Синтаксис: double HRDelay(const double Milliseconds);
Double Milliseconds - задержка в миллисекундах (может быть дробной)
Результат функции - фактически произошедшая задержка с погрешностью.
Пример вызова функции: double X = HRDelay(100.0); или HRDelay(100.0);}
function HRDelay(const Milliseconds: Double): Double;
implementation
function HRDelay(const Milliseconds: Double): Double;
begin
Timer.StartTimer();
repeat
Result:= Timer.ReadTimer();
until Result >= Milliseconds;
end;
{ THRTimer }
constructor THRTimer.Create;
var
QW: LARGE_INTEGER;
begin
inherited Create;
Exists := QueryPerformanceFrequency(Int64(QW));
ClockRate := QW.QuadPart;
end;
function THRTimer.StartTimer: Boolean;
var
QW: LARGE_INTEGER;
begin
Result := QueryPerformanceCounter(Int64(QW));
StartTime := QW.QuadPart;
end;
function THRTimer.ReadTimer: Double;
var
ET: LARGE_INTEGER;
begin
QueryPerformanceCounter(Int64(ET));
Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
end;
initialization
Timer:= THRTimer.Create();
finalization
Timer.Free();
end.