unit PalPrimeForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
const
WM_DATA_IN_BUF = WM_APP + 1000;
MaxMemoLines = 20;
type
TPalFrm = class(TForm)
ResultsMemo: TMemo;
StartButton: TButton;
StopButton: TButton;
procedure StartButtonClick(Sender: TObject);
procedure StopButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FStringSectInit: boolean;
FStringBuf: TStringList;
StringSection: TRTLCriticalSection;
procedure UpdateButtons;
procedure HandleNewData(var Message: TMessage); message WM_DATA_IN_BUF;
public
{ Public declarations }
end;
var
PalFrm: TPalFrm;
implementation
uses PrimeThreads;
{$R *.DFM}
procedure TPalFrm.UpdateButtons;
begin
StopButton.Enabled := FStringSectInit;
StartButton.Enabled := not FStringSectInit;
end;
procedure TPalFrm.StartButtonClick(Sender: TObject);
begin
if not FStringSectInit then
begin
InitializeCriticalSection(StringSection);
FStringBuf := TStringList.Create;
FStringSectInit := true;
StartThreads(Self, @StringSection, WM_DATA_IN_BUF, FStringBuf);
end;
UpdateButtons;
end;
procedure TPalFrm.StopButtonClick(Sender: TObject);
begin
if FStringSectInit then
begin
ResultsMemo.Lines.Add('Please wait...');
StopThreads;
ResultsMemo.Lines.Add('Done!');
FStringBuf.Free;
FStringBuf := nil;
DeleteCriticalSection(StringSection);
FStringSectInit := false;
end;
UpdateButtons;
end;
procedure TPalFrm.HandleNewData(var Message: TMessage);
begin
if FStringSectInit then
begin
EnterCriticalSection(StringSection);
ResultsMemo.Lines.Add(FStringBuf.Strings[0]);
FStringBuf.Delete(0);
LeaveCriticalSection(StringSection);
if ResultsMemo.Lines.Count > MaxMemoLines then
ResultsMemo.Lines.Delete(0);
end;
end;
procedure TPalFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
StopButtonClick(Self);
end;
end.