unit PrimeThread;
 
interface
 
uses
 Classes, Windows;
 
type
 TPrimeThrd2 = class(TThread)
 private
 { Private declarations }
 FStartNum: integer;
 function IsPrime(TestNo: integer): boolean;
 protected
 procedure Execute; override;
 public
 property StartNum: integer read FStartNum write FStartNum;
 end;
 
implementation
 
uses PrimeForm2, SysUtils;
 
function TPrimeThrd2.IsPrime(TestNo: integer): boolean;
 
var
 iter: integer;
 
begin
 result := true;
 if TestNo < 0 then
 result := false;
 if TestNo <= 2 then
 exit;
 iter := 2;
 while (iter < TestNo) and (not terminated) do
 begin
 if (TestNo mod iter) = 0 then
 begin
 result := false;
 exit;
 end;
 Inc(iter);
 end;
end;
 
procedure TPrimeThrd2.Execute;
 
var
 CurrentNum: integer;
 
begin
 CurrentNum := FStartNum;
 while not Terminated do
 begin
 if IsPrime(CurrentNum) then
 begin
 EnterCriticalSection(PrimeFrm.StringSection);
 PrimeFrm.StringBuf.Add(IntToStr(CurrentNum) + ' es primo.');
 LeaveCriticalSection(PrimeFrm.StringSection);
 PostMessage(PrimeFrm.Handle, WM_DATA_IN_BUF, 0, 0);
 end;
 Inc(CurrentNum);
 end;
end;
 
end.