Wenn du schon XE2 einsetzt, warum willst du unbedingt mit Arrays arbeiten?
IMHO wäre eine TQueue hier genau richtig. Die Verarbeitung dauert relativ lange (hast du gesagt), dann würde ich auf jeden Fall nicht erst alles abarbeiten und dann zu schauen, ob der Thread evtl. abgebrochen wird, sondern immer nur ein Paket bearbeiten.
Delphi-Quellcode:
TMyThread = class( TThread )
strict private
FCS : TCriticalSection;
FQueue : TQueue<TMyRecord>;
protected Execute; override;
public
procedure Add( ARecord : TMyRecord );
end;
TMyThread.Add( ARecord : TMyRecord );
begin
FCS.Enter;
try
FQueue.Enqueue( ARecord );
finally
FCS.Leave;
end;
TMyThread.Execute;
var
LRecord : TMyRecord;
LHasData : Boolean;
begin
while not Terminated do
begin
// Raus aus der Queue
FCS.Enter;
try
LHasData := ( FQueue.Count > 0 );
if LHasData then
LRecord := FQueue.Dequeue;
finally
FCS.Leave;
end;
// Hier bietet sich auch wunderbar ein Event an, da der Thread dann solange schläft
// bis wieder Daten vorhanden sind, oder der Thread terminiert wurde
// Wenn keine Daten, dann schlafen und wieder von Vorne
if not LHasData then
begin
Sleep( 1 );
Continue;
end;
// Bearbeiten
if LRecord.Use then
...
// Rein in die Queue (wenn es denn sein soll)
if LRecord.Use then
begin
FCS.Enter;
try
FQueue.Enqueue( LRecord );
finally
FCS.Leave;
end;
end;
end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)