unit PrimeForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TPrimeFrm = class(TForm) NumEdit: TEdit; SpawnButton: TButton; ResultsMemo: TMemo; procedure SpawnButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private declarations } FThreadRefCount: integer; procedure HandleTerminate(Sender: TObject); public { Public declarations } end; var PrimeFrm: TPrimeFrm; implementation uses PrimeThread; {$R *.DFM} procedure TPrimeFrm.SpawnButtonClick(Sender: TObject); var NewThread: TPrimeThrd; begin NewThread := TPrimeThrd.Create(True); NewThread.FreeOnTerminate := True; try with NewThread do begin TestNumber := StrToInt(NumEdit.Text); Inc(FThreadRefCount); OnTerminate := HandleTerminate; Resume; end; except on EConvertError do begin NewThread.Free; ShowMessage('That is not a valid number!'); end; end; end; procedure TPrimeFrm.FormCreate(Sender: TObject); begin FThreadRefCount := 0; end; procedure TPrimeFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := true; if FThreadRefCount > 0 then begin if MessageDlg('Threads active. Do you still want to quit?', mtWarning, [mbYes, mbNo], 0) = mrNo then CanClose := false; end; end; procedure TPrimeFrm.HandleTerminate(Sender: TObject); begin Dec(FThreadRefCount); end; end.