unit PrimeForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, PrimeThread; const WM_THREAD_COMPLETE = WM_APP + 5437; { Just a magic number } 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('That is not a valid number!'); end; end; end; end; procedure TPrimeFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := true; if Assigned(FThread) then begin if MessageDlg('Threads active. Do you still want to quit?', mtWarning, [mbYes, mbNo], 0) = mrNo then CanClose := false; end; {Sleep(50000);}{Line C} if CanClose then begin if Assigned(FThread) then begin FThread.Terminate; FThread.WaitFor; FThread.Free; FThread := nil; end; end; end; end.