61 lines
1.2 KiB
ObjectPascal
61 lines
1.2 KiB
ObjectPascal
program ConcurrentComputing;
|
|
{$IFdef FPC}
|
|
{$MODE DELPHI}
|
|
{$ELSE}
|
|
{$APPTYPE CONSOLE}
|
|
{$ENDIF}
|
|
uses
|
|
{$IFDEF UNIX}
|
|
cthreads,
|
|
{$ENDIF}
|
|
SysUtils, Classes;
|
|
|
|
type
|
|
TRandomThread = class(TThread)
|
|
private
|
|
FString: string;
|
|
T0 : Uint64;
|
|
protected
|
|
procedure Execute; override;
|
|
public
|
|
constructor Create(const aString: string); overload;
|
|
end;
|
|
const
|
|
MyStrings: array[0..2] of String = ('Enjoy ','Rosetta ','Code ');
|
|
var
|
|
gblRunThdCnt : LongWord = 0;
|
|
|
|
constructor TRandomThread.Create(const aString: string);
|
|
begin
|
|
inherited Create(False);
|
|
FreeOnTerminate := True;
|
|
FString := aString;
|
|
interlockedincrement(gblRunThdCnt);
|
|
end;
|
|
|
|
procedure TRandomThread.Execute;
|
|
var
|
|
i : NativeInt;
|
|
begin
|
|
i := Random(300);
|
|
T0 := GettickCount64;
|
|
Sleep(i);
|
|
//output of difference in time
|
|
Writeln(FString,i:4,GettickCount64-T0 -i:2);
|
|
interlockeddecrement(gblRunThdCnt);
|
|
end;
|
|
|
|
var
|
|
lThreadArray: Array[0..9] of THandle;
|
|
i : NativeInt;
|
|
begin
|
|
Randomize;
|
|
|
|
gblRunThdCnt := 0;
|
|
For i := low(lThreadArray) to High(lThreadArray) do
|
|
lThreadArray[i] := TRandomThread.Create(Format('%9s %4d',[myStrings[Random(3)],i])).Handle;
|
|
|
|
while gblRunThdCnt > 0 do
|
|
sleep(125);
|
|
end.
|