unit PrimeForm;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, PrimeThread;
 
const
 WM_THREAD_COMPLETE = WM_APP + 5437; { Un nmero al azar }
 
type
 TPrimeFrm = class(TForm)
 NumEdit: TEdit;
 SpawnButton: TButton;
 ResultsMemo: TMemo;
 procedure SpawnButtonClick(Sender: TObject);
 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 private
 { Private declarations }
 FThread: TPrimeThrd;
 procedure HandleThreadCompletion(var Message: TMessage); message WM_THREAD_COMPLETE;
 public
 { Public declarations }
 end;
 
var
 PrimeFrm: TPrimeFrm;
 
implementation
 
{$R *.DFM}
 
procedure TPrimeFrm.HandleThreadCompletion(var Message: TMessage);
begin
 if Assigned(FThread) then
 begin
 FThread.WaitFor;
 FThread.Free;
 FThread := nil;
 end;
end;
 
procedure TPrimeFrm.SpawnButtonClick(Sender: TObject);
 
begin
 if not Assigned(FThread) then
 begin
 FThread := TPrimeThrd.Create(True);
 FThread.FreeOnTerminate := false;
 try
 with FThread do
 begin
 TestNumber := StrToInt(NumEdit.Text);
 Resume;
 end;
 except on EConvertError do
 begin
 FThread.Free;
 FThread := nil;
 ShowMessage('No ha introducido un nmero vlido!');
 end;
 end;
 end;
end;
 
procedure TPrimeFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose := true;
 if Assigned(FThread) then
 begin
 if MessageDlg('Hay hilos activos. An as desea salir?',
 mtWarning, [mbYes, mbNo], 0) = mrNo then
 CanClose := false;
 end;
 {Sleep(50000);}{Lnea C}
 if CanClose then
 begin
 if Assigned(FThread) then
 begin
 FThread.Terminate;
 FThread.WaitFor;
 FThread.Free;
 FThread := nil;
 end;
 end;
end;
 
end.