Oje...
Rule 1 - ein Thread hat kein Sleep!
Auch der Zugriff auf Count muss gelocked werden.
Sodo Code.
Thread:
Delphi-Quellcode:
While not Terminated do
begin
if Queue.Count = 0 then
E_Event.WaitFor(INFINITE);
if not terminated then
begin
// DeQueue
end;
end;
Queue:
Delphi-Quellcode:
Procedure Enqueue(aData : TData);
begin
TMonitor.Enter;
try
fQueue.Add(aData);
finally
TMonitor.Leave;
end;
E_Event.SetEvent;
end;
Den E_Event des Threads wird and die Queue übergeben.
Nicht vergessen:
Delphi-Quellcode:
procedure TMyThread.Terminate;
begin
inherited Terminate;
E_Event.SetEvent;
end;
Hier nochmal den
Link zu meiner CodeRage 2020 Session zum Thema Threads & Queues!
Mavarik