unit PrimeThread; interface uses Classes; type TPrimeThrd = class(TThread) private FTestNumber: integer; FResultString: string; protected function IsPrime: boolean; procedure UpdateResults; procedure Execute; override; public property TestNumber: integer write FTestNumber; end; implementation uses SysUtils, Dialogs, PrimeForm, Windows; procedure TPrimeThrd.UpdateResults; begin PrimeFrm.ResultsMemo.Lines.Add(FResultString); end; function TPrimeThrd.IsPrime: boolean; var iter: integer; begin result := true; if FTestNumber < 0 then begin result := false; exit; end; if FTestNumber <= 2 then exit; iter := 2; while (iter < FTestNumber) and (not terminated) do {Line A} begin if (FTestNumber mod iter) = 0 then begin result := false; {exit;} end; Inc(iter); end; end; procedure TPrimeThrd.Execute; begin if IsPrime then FResultString := IntToStr(FTestNumber) + ' is prime.' else FResultString := IntToStr(FTestNumber) + ' is not prime.'; if not Terminated then {Line B} begin Synchronize(UpdateResults); PostMessage(PrimeFrm.Handle, WM_THREAD_COMPLETE, 0, 0); end; end; end.