Guten Morgen,
basierend auf diesem Thread (
https://www.delphipraxis.net/217196-...angeblich.html), wurde mir ziemlich oft gesagt, warum machst du das so und so und nicht mit Queues und Events im Thread.
Jetzt mache ich einfach ein separaten Beitrag dazu hier auf und hoffe, jemand kann genau diese Aussage in Form von Quelltext mal zeigen, wie es funktioniert bzw. funktionen sollte.
Delphi-Quellcode:
TDataQueue = class
private
FQueue: TQueue<TDataRec>;
FLock: TCriticalSection;
public
constructor Create;
destructor Destroy; override;
procedure Enqueue(const Data: TDataRec);
function Dequeue: TDataRec;
end;
constructor TDataQueue.Create;
begin
FQueue := TQueue<TDataRec>.Create;
FLock := TCriticalSection.Create;
end;
destructor TDataQueue.Destroy;
begin
FQueue.Free;
FLock.Free;
inherited;
end;
procedure TDataQueue.Enqueue(const Data: TDataRec);
begin
FLock.Acquire;
try
FQueue.Enqueue(Data);
finally
FLock.Release;
end;
end;
function TDataQueue.Dequeue: TDataRec;
begin
FLock.Acquire;
try
if FQueue.Count > 0 then
Result := FQueue.Dequeue
else
begin
Result.Clear;
end;
finally
FLock.Release;
end;
end;
TMyThread = class(TThread)
private
FDataQueue: TDataQueue;
protected
procedure Execute; override;
public
constructor Create(ADataQueue: TDataQueue);
end;
constructor TMyThread.Create(ADataQueue: TDataQueue);
begin
FDataQueue := ADataQueue;
Inherited Create(False);
end;
procedure TMyThread.Execute;
var
RecData : TDataRec;
begin
while not Terminated do
begin
if Terminated then
Exit;
if Assigned(FDataQueue) then
begin
if FDataQueue.Count > 0 then
begin
RecData := FDataQueue.Dequeue;
//Hier etwas mit den Daten/der Nachricht machen
end
else
begin
Sleep(1);
end;
end;
end;
end;
Aufgabenstellung:
Ein Thread soll über die Queue Daten erhalten und damit irgendwas machen.
Gleichzeitig will ich den Threads mit Events von "außen" bestimmte Dinge mitteilen (z.B. die eingelesenen Nachrichten anders zu verarbeiten bzw gar nicht zu verarbeiten oder das sich der gesamte Thread selber terminieren soll). Wie ich es aktuell gemacht habe, ist in dem oben verlinkten Beitrag ausführlich beschrieben. Hier in diesem Beitrag soll es nur um die Alternative gehen. Danke