1 2 3 4 5 6 7 8 9 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 81 82 83
| unit UnitChronometer;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, StdCtrls, Unix;
type
TForm1 = class(TForm)
StartButton: TButton;
StopButton: TButton;
ResetButton: TButton;
Label1: TLabel;
procedure StartButtonClick(Sender: TObject);
procedure StopButtonClick(Sender: TObject);
procedure ResetButtonClick(Sender: TObject);
private
FStartTime: TTimeVal;
FStopTime: TTimeVal;
FRunning: Boolean;
function GetElapsedTime: Double;
public
property ElapsedTime: Double read GetElapsedTime; // Temps en microsecondes
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.StartButtonClick(Sender: TObject);
begin
if not FRunning then
begin
fpgettimeofday(@FStartTime, nil); // Démarrer le chronomètre
FRunning := True;
end;
end;
procedure TForm1.StopButtonClick(Sender: TObject);
begin
if FRunning then
begin
fpgettimeofday(@FStopTime, nil); // Arrêter le chronomètre
FRunning := False;
Label1.Caption := Format('Temps écoulé : %.3f μs', [ElapsedTime]);
end;
end;
procedure TForm1.ResetButtonClick(Sender: TObject);
begin
FStartTime.tv_sec := 0;
FStartTime.tv_usec := 0;
FStopTime.tv_sec := 0;
FStopTime.tv_usec := 0;
FRunning := False;
Label1.Caption := 'Temps écoulé : 0 μs';
end;
function TForm1.GetElapsedTime: Double;
var
StartMicros, StopMicros: Int64;
begin
if FRunning then
begin
// Si le chronomètre est toujours en cours, utiliser l'heure actuelle
fpgettimeofday(@FStopTime, nil);
end;
// Convertir les valeurs en microsecondes
StartMicros := (FStartTime.tv_sec * 1000000) + FStartTime.tv_usec;
StopMicros := (FStopTime.tv_sec * 1000000) + FStopTime.tv_usec;
// Calculer le temps écoulé
Result := StopMicros - StartMicros;
end;
end. |
Partager