unit PrimeRangeThread; interface uses Classes, BlockToAsyncBuf; 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; end.