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('Por favour espere...');
††† StopThreads;
††† ResultsMemo.Lines.Add('Hecho!');
††† 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.