{█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█}
{█ █}
{█ 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.