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.