unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
WorkerThreadUnit;
type
TForm1 =
class(TForm)
btnStartThread: TButton;
btnSendData: TButton;
btnModeNormal: TButton;
btnModeIgnore: TButton;
btnModeAlternative: TButton;
btnStopThread: TButton;
MemoLog: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnStartThreadClick(Sender: TObject);
procedure btnSendDataClick(Sender: TObject);
procedure btnModeNormalClick(Sender: TObject);
procedure btnModeIgnoreClick(Sender: TObject);
procedure btnModeAlternativeClick(Sender: TObject);
procedure btnStopThreadClick(Sender: TObject);
private
FWorker: TMyWorkerThread;
FDataCounter: Integer;
procedure LogMessage(
const Msg:
string);
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FWorker :=
nil;
FDataCounter := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FWorker)
then
begin
FWorker.StopThread;
FWorker.Terminate;
FWorker.WaitFor;
FreeAndNil(FWorker);
end;
end;
procedure TForm1.btnStartThreadClick(Sender: TObject);
begin
if not Assigned(FWorker)
then
begin
FWorker := TMyWorkerThread.Create(
procedure(
const Msg:
string)
begin
LogMessage(Msg);
end);
LogMessage('
Thread gestartet.');
end;
end;
procedure TForm1.btnSendDataClick(Sender: TObject);
begin
if Assigned(FWorker)
then
begin
Inc(FDataCounter);
FWorker.EnqueueData('
Nachricht #' + FDataCounter.ToString);
end;
end;
procedure TForm1.btnModeNormalClick(Sender: TObject);
begin
if Assigned(FWorker)
then
begin
FWorker.SetProcessingMode(0);
LogMessage('
Modus: Normal');
end;
end;
procedure TForm1.btnModeIgnoreClick(Sender: TObject);
begin
if Assigned(FWorker)
then
begin
FWorker.SetProcessingMode(1);
LogMessage('
Modus: Ignorieren');
end;
end;
procedure TForm1.btnModeAlternativeClick(Sender: TObject);
begin
if Assigned(FWorker)
then
begin
FWorker.SetProcessingMode(2);
LogMessage('
Modus: Alternative Verarbeitung');
end;
end;
procedure TForm1.btnStopThreadClick(Sender: TObject);
begin
if Assigned(FWorker)
then
begin
FWorker.StopThread;
FWorker.Terminate;
FWorker.WaitFor;
FreeAndNil(FWorker);
LogMessage('
Thread gestoppt.');
end;
end;
procedure TForm1.LogMessage(
const Msg:
string);
begin
TThread.Queue(
nil,
procedure begin
MemoLog.Lines.Add(Msg);
end);
end;
end.