unit PrimeForm2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, PrimeThread; const WM_DATA_IN_BUF = WM_APP + 1000; MaxMemoLines = 20; type TPrimeFrm = class(TForm) ResultMemo: TMemo; StartBtn: TButton; StartNumEdit: TEdit; StopBtn: TButton; procedure StartBtnClick(Sender: TObject); procedure StopBtnClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } FStringSectInit: boolean; FPrimeThread: TPrimeThrd2; FStringBuf: TStringList; procedure UpdateButtons; procedure HandleNewData(var Message: TMessage); message WM_DATA_IN_BUF; public { Public declarations } StringSection: TRTLCriticalSection; property StringBuf: TStringList read FStringBuf write FStringBuf; end; var PrimeFrm: TPrimeFrm; implementation {$R *.DFM} procedure TPrimeFrm.UpdateButtons; begin StopBtn.Enabled := FStringSectInit; StartBtn.Enabled := not FStringSectInit; end; procedure TPrimeFrm.StartBtnClick(Sender: TObject); begin if not FStringSectInit then begin InitializeCriticalSection(StringSection); FStringBuf := TStringList.Create; FStringSectInit := true; FPrimeThread := TPrimeThrd2.Create(true); SetThreadPriority(FPrimeThread.Handle, THREAD_PRIORITY_BELOW_NORMAL); try FPrimeThread.StartNum := StrToInt(StartNumEdit.Text); except on EConvertError do FPrimeThread.StartNum := 2; end; FPrimeThread.Resume; end; UpdateButtons; end; procedure TPrimeFrm.StopBtnClick(Sender: TObject); begin if FStringSectInit then begin with FPrimeThread do begin Terminate; WaitFor; Free; end; FPrimeThread := nil; FStringBuf.Free; FStringBuf := nil; DeleteCriticalSection(StringSection); FStringSectInit := false; end; UpdateButtons; end; procedure TPrimeFrm.HandleNewData(var Message: TMessage); begin if FStringSectInit then {Not necessarily the case!} begin EnterCriticalSection(StringSection); ResultMemo.Lines.Add(FStringBuf.Strings[0]); FStringBuf.Delete(0); LeaveCriticalSection(StringSection); {Now trim the Result Memo.} if ResultMemo.Lines.Count > MaxMemoLines then ResultMemo.Lines.Delete(0); end; end; procedure TPrimeFrm.FormClose(Sender: TObject; var Action: TCloseAction); begin StopBtnClick(Self); end; end.