Metropoli BBS
VIEWER: ratrace.pas MODE: TEXT (CP437)
{█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█}
{█                                                       █}
{█      Virtual Pascal Examples. Version 1.10            █}
{█      Multi-threaded example                           █}
{█      ─────────────────────────────────────────────────█}
{█      Copyright (C) 1995,96 fPrint UK Ltd              █}
{█                                                       █}
{▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀}

program RatRace;

{$PMTYPE VIO}
{$X+,Delphi+}

uses Crt, Dos, Os2Def, Os2Base, Use32;

{$IFDEF VPDEMO}
  {&Dynamic VP11Demo.Lib}
{$ENDIF}

const
  RatColors: array[1..8] of Byte =
    ( DarkGray     ,
      LightBlue    ,
      LightGreen   ,
      LightCyan    ,
      LightRed     ,
      LightMagenta ,
      Yellow       ,
      White
    );

  RatBody: String[11] = '---<O[x]Oo.';
  FinishDrawPos: Integer = 16;

var
  I: Integer;
  ThreadId: Longint;
  ScreenSemaphore: HMtx;

const
  Idx: Integer = 0;

threadvar
  Number: Integer;

function Rat( P : Pointer): Longint;
var
  Step, S: Integer;
begin
  Step := 1;
  Inc(Idx);
  Number := Idx;
  repeat
    DosRequestMutexSem(ScreenSemaphore, sem_Indefinite_Wait);
    TextColor(Longint(p));
    S := Step;
    if Step <> 1 then Dec(S);
    GotoXY(S, 2 + Number * 2);
    RatBody[7] := Chr(Number + Ord('0'));
    if Step <> 1 then Write(' ');
    Write(RatBody);
    Inc(Step);
    if WhereX = 80 then Break;
    DosReleaseMutexSem(ScreenSemaphore);
    Delay(Random(300));
  until False;
  GotoXY(FinishDrawPos, 24);
  Inc(FinishDrawPos);
  Write(Number);
  DosReleaseMutexSem(ScreenSemaphore);
end;

begin
  DosCreateMutexSem(nil, ScreenSemaphore, 0, False);
  TextMode(CO80);
  ClrScr;
  TextColor(White);
  Writeln('Virtual Pascal multi-thread example v1.10 (C) 1995,96 fPrint UK Ltd' );
  Write('                            The Rat Race!');
  GotoXY(1, 24);
  Write('Finish order: ');
  GotoXY(25, 25);
  Write('Press any key to exit');
  for I := Low(RatColors) to High(RatColors) do
    BeginThread(nil, 16*1024, Rat, Pointer(RatColors[I]), create_Ready, ThreadId);
  ReadKey;
end.

[ RETURN TO DIRECTORY ]