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

📄 utimer.pas

📁 delphi 开发OPc工业通讯 delphi 开发OPc工业通讯
💻 PAS
字号:
//******************************************************************************
// sOPC created by ACHAT SOLUTIONS GmbH, http://www.achat-solutions.de/
//******************************************************************************
unit uTimer;

interface

uses
  Windows;

//******************************************************************************
type
  sTimer = class(TObject)
  private
    Freq: int64;
    Time: int64;
    FStopTime: int64;                         // Zeitmarke f黵 Stopaufruf
    FRunning: boolean;

    function ReadTimer: int64;                // Zeitmarke holen
    function TimeDiff(Start: int64): int64;   // Zeitdifferenz in Ticks
    function msTimeDiff(Start: int64): int64; // Zeitdifferenz in Millisekunden [ms]

  public
    constructor Create(AutoStart: boolean = True);

    procedure Start;
    // Timer starten, Aufruf von Start stellt den Timer wieder
    // auf Null

    procedure Stop;
    // Timer stoppen, -> isRunning = False

    function isRunning: boolean;
    // True -> Timer l鋟ft

    function msTime: double;
    // vergangene Zeit in Millisekunden [ms] mit 祍 Aufl鰏ung
    // z.B. 100 祍 -> R點kgabewert 0.1

    function secTime: int64;
    // vergangene Zeit in Sekunden [sec]

    procedure Delay(ms: integer);
    // Zeitverz鰃erung in [ms]
  end;

//******************************************************************************
implementation

//******************************************************************************
function sTimer.ReadTimer: int64;
begin
  QueryPerformanceCounter(TLargeInteger(Result));
end;

function sTimer.TimeDiff(Start: int64): int64;
begin
  Result := 0;
  if not FRunning then begin
    if FStopTime > Start then Result := (FStopTime - Start);
  end else begin
    Result := (ReadTimer - Start);
  end;
end;

function sTimer.msTimeDiff(Start: int64): int64;
begin
  Result := (TimeDiff(Start) * 1000) div Freq;
end;

constructor sTimer.Create(AutoStart: boolean);
var
  aFreq: int64;
begin
  inherited Create;
  FRunning := False;
  Time := 0;
  FStopTime := 0;
  QueryPerformanceFrequency(aFreq);
  Freq := aFreq;
  if AutoStart then Start;
end;

procedure sTimer.Start;
begin
  FRunning := True;
  Time := ReadTimer;
end;

procedure sTimer.Stop;
begin
  // FStopTime wird nur gesetzt, wenn vorher Start aufgerufen wurde!
  if FRunning then FStopTime := ReadTimer;
  FRunning := False;
end;

function sTimer.isRunning: boolean;
begin
  Result := FRunning;
end;

function sTimer.msTime: double;
begin
  Result := (TimeDiff(Time) * 1000) / Freq;
end;

function sTimer.secTime: int64;
begin
  Result := TimeDiff(Time) div Freq;
end;

procedure sTimer.Delay(ms: integer);
var
  t: int64;
begin
  t := ReadTimer;
  while msTimeDiff(t) < ms do;
end;

//******************************************************************************
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -