type TPrimeRangeThread = class(TThread) private { Private declarations } FBuf: TBlockToAsyncBuf; protected function IsPrime(TestNum: integer): boolean; procedure Execute; override; public published property Buf: TBlockToAsyncBuf read FBuf write FBuf; end;
TRangeRequestType = record Low, High: integer; end;
PRangeRequestType = ^TRangeRequestType;
{ Results returned in a string list }
implementation
uses SysUtils;
{ TPrimeRangeThread }
function TPrimeRangeThread.IsPrime(TestNum: integer): boolean;
var iter: integer;
begin result := true; if TestNum < 0 then result := false; if TestNum <= 2 then exit; iter := 2; while (iter < TestNum) and (not terminated) do {Line A} begin if (TestNum mod iter) = 0 then begin result := false; exit; end; Inc(iter); end; end;
procedure TPrimeRangeThread.Execute;
var PRange: PRangeRequestType; TestNum: integer; Results: TStringList;
begin while not Terminated do begin PRange := PRangeRequestType(FBuf.BlockingRead); if Assigned(PRange) then begin Assert(PRange.Low <= PRange.High); Results := TStringList.Create; Results.Add('Primes from: ' + IntToStr(PRange.Low) + ' to: ' + IntToStr(PRange.High)); for TestNum := PRange.Low to PRange.High do begin if IsPrime(TestNum) then Results.Add(IntToStr(TestNum) + ' is prime.'); end; if not FBuf.BlockingWrite(Results) then begin Results.Free; Terminate; end; end else Terminate; end; end;