[Back to TIMING SWAG index]  [Back to Main SWAG index]  [Original]

{
I don't know if you have something similar already in SWAG, but I have made
a
unit that converts a time to a longint, in a different way than PackTime and
Unpacktime. The longint is gives can be used to calculate. You can, for
instance, calculate a remaining time of a specific action. Here's the source
code:
=== Cut === }

unit TimeIt;
{ TIMEIT.PAS was written by Jasper van Woudenberg and is donated to the
 public domain. If you use (part) of this code, I would appreciate some
 credit.
 You can contact the author at 2:2801/506.5
 TimeIt is a unit to convert Time into a LongInt, so you can calculate with
 it. Included are procedures to calculate the remaining time of an action. }
interface
type
 PEstTime = ^TEstTime;
 TEstTime = record                { Record used to calculate remaining time 
}
        BeginTime,
        TimeNow,
        TimeBusy,
        EstTime,
        TimeRem,
        LastTime,
        NumSteps,
        Step     : LongInt;
        Perc     : Real;
       end;
const
 MaxHour = 5964;
 MaxMin  = 59;
 MaxSec  = 59;
 MaxS100 = 99;
 MaxTime = (MaxHour * (MaxMin + 1) * (MaxSec + 1) * (MaxS100 + 1)) +
      (MaxMin * (MaxSec + 1) * (MaxS100 + 1)) +
      (MaxSec * (MaxS100 + 1)) +
      (MaxS100);
function Time2LInt(H, M, S, S100 : LongInt) : LongInt;
{ Convert Time to a LongInt }
procedure LInt2Time(L : LongInt; var H, M, S, S100 : LongInt);
{ Convert LongInt to a time }
function GetTimeLI : LongInt;
{ Get current time, return as longint }
procedure SetTimeLI(T : LongInt);
{ Set current time, given a longint }
procedure InitEstTime(var T : TEstTime; NS : LongInt);
{ Initiate the estimated time routine }
procedure CalcEstTime(var T : TEstTime);
{ Calculate remaining time }
implementation
uses
 Dos;
function Time2LInt(H, M, S, S100 : LongInt) : LongInt;
var
 L : LongInt;
begin
 if S100 > MaxS100 then
 begin
  S := S + (S100 div (MaxS100 + 1));
  S100 := S100 mod (MaxS100 + 1);
 end;
 if S > MaxSec then
 begin
  M := M + (S div (MaxSec + 1));
  S := S mod (MaxSec + 1);
 end;
 if M > MaxMin then
 begin
  H := H + (M div (MaxMin + 1));
  M := M mod (MaxMin + 1);
 end;
 if H > MaxHour then
  H := MaxHour;
 if H < 0 then
  H := 0;
 if M < 0 then
  M := 0;
 if S < 0 then
  S := 0;
 if S100 < 0 then
  S := 0;
 L := (H * (MaxMin + 1) * (MaxSec + 1) * (MaxS100 + 1)) +
    (M * (MaxSec + 1) * (MaxS100 + 1)) +
    (S * (MaxS100 + 1)) +
    (S100);
 if (L > MaxTime) or (L < 0) then
  L := MaxTime;
 Time2LInt := L;
end; { Time2LInt }
procedure LInt2Time(L : LongInt; var H, M, S, S100 : LongInt);
begin
 if (L > MaxTime) or (L < 0) then
  L := MaxTime;
 H := L div ((MaxMin + 1) * (MaxSec + 1) * (MaxS100 + 1));
 L := L - (H * ((MaxMin + 1) * (MaxSec + 1) * (MaxS100 + 1)));
 M := L div ((MaxSec + 1) * (MaxS100 + 1));
 L := L - (M * (MaxSec + 1) * (MaxS100 + 1));
 S := L div (MaxS100 + 1);
 L := L - (S * (MaxS100 + 1));
 S100 := L;
end; { LInt2Time }
function GetTimeLI : LongInt;
var
 H, M, S, S100 : LongInt;
begin
 H := 0;
 M := 0;
 S := 0;
 S100 := 0;
 GetTime(Word(H), Word(M), Word(S), Word(S100));
 GetTimeLI := Time2LInt(H, M, S, S100);
end; { GetTimeLI }
procedure SetTimeLI(T : LongInt);
var
 H, M, S, S100 : LongInt;
begin
 LInt2Time(T, H, M, S, S100);
 SetTime(Word(H), Word(M), Word(S), Word(S100));
end; { SetTimeLI }
procedure InitEstTime(var T : TEstTime; NS : LongInt);
begin
 FillChar(T, SizeOf(T), 0);
 T.BeginTime := GetTimeLI;
 T.NumSteps := NS;
 T.Step := 0;
end; { InitEstTime }
procedure CalcEstTime(var T : TEstTime);
begin
 with T do
 begin
  Step := Step + 1;
  Perc := Step / NumSteps * 100;
  if Perc <> 0 then
  begin
   TimeNow := GetTimeLI;
   if ((LastTime div 100) <> (TimeNow div 100)) and
     ((TimeNow div 100) > (BeginTime div 100)) then
   begin
    LastTime := GetTimeLI;
    TimeBusy := TimeNow - BeginTime;
    EstTime := Round(TimeBusy / Perc * 100);
    TimeRem := EstTime - TimeBusy;
   end;
  end;
 end;
end; { CalcEstTime }
end.

=== Cut ===
This is a little demo program that shows how to use the TimeIt unit:
=== Cut ===

program TimeItDemo;
{ TIDEMO.PAS was written by Jasper van Woudenberg and is donated to the
 public domain. If you use (part) of this code, I would appreciate some
 credit.
 You can contact the author at 2:2801/506.5
 TimeItDemo is a very simple demo program that shows how to use the TimeIt
 unit. }
uses
 Crt, TimeIt;
procedure WriteTime(Str : string; Time : LongInt);
var
 H, M, S, S100 : LongInt;
begin
 LInt2Time(Time, H, M, S, S100);
 WriteLn(Str, H, ':', M, ':', S, '.', S100, '  ');
end; { WriteTime }
var
 I             : Word;
 EstTime       : TEstTime;
begin
 ClrScr;
 InitEstTime(EstTime, 60000);
 for I := 1 to 60000 do
 begin
{ You can replace this little loop with a lot of things: a file copying 
loop,
 a sorting algorithm, or whatever has very similar repetitive actions. }
  CalcEstTime(EstTime);
  GotoXY(1, 1);
  with EstTime do
  begin
   WriteTime('Start time     : ', BeginTime);
   WriteTime('Time now       : ', TimeNow);
   WriteTime('Time busy      : ', TimeBusy);
   WriteTime('Estimated time : ', EstTime);
   WriteTime('Time remaining : ', TimeRem);
   WriteLn;
   WriteLn  ('Num steps      : ', NumSteps);
   WriteLn  ('Step           : ', Step);
   WriteLn  ('Percentage     : ', Round(Perc));
  end;
 end;
end.

[Back to TIMING SWAG index]  [Back to Main SWAG index]  [Original]