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) + ' is prime.'); LeaveCriticalSection(PrimeFrm.StringSection); PostMessage(PrimeFrm.Handle, WM_DATA_IN_BUF, 0, 0); end; Inc(CurrentNum); end; end; end.