Hmm..
Wieso umkopieren?
Während des Umkopieren ist die Liste gelockt, ein Hinzufügen würde nicht möglich sein...
Alternative:
Delphi-Quellcode:
procedure TListThread.Add(AItem : TValues);
begin
tmpList := threadList1.LockList; // Liste Locken
try
tmpList.Add(AItem); // Item anhängen
finally
threadList1.UnlockList; // Liste Unlock
end;
end;
procedure TListThread.Execute;
var
Temp: TValues ;
tmpList : TList;
begin
ListthreadRunning:= true;
while(not Terminated) do // Dauerschleife
begin
Temp := nil;
tmpList := threadList1.LockList; // Liste Locken
try
if tmpList.Count > 0 then // Sind EIntrage vorhanden
begin
Temp:= tmpList.Items[0]; // Nur den ersten nehmen
tmpList.Delete(0); // den Ersten aus der Liste entfernen
end;
finally
threadList1.UnlockList; // Liste Unlock
end;
if Assigned(Temp) then
DoItemWork(Temp); // -> Verarbeiten (Datenbank), während Liste wieder frei zum Füllen
Sleep(1); // anderem Thread Zeit geben
end; // While..
listthreadRunning:= false;
end;
Da Du ja eh in einer (While) Dauerschleife bist, kannst du ja nach dem FIFO-Prinzip immer nur den ersten Eintrag aus der Liste nehmen, wenn er vorhanden ist.
Nur während des Überprüfen, ob eine Eintrag vorhanden ist und der Entnahme ist die Liste gelockt (sehr kurz).
Die Verarbeitung des Eintrages erfolgt außerhalb des Locks und somit kann währenddessen weiter neue Einträge angehängt werden.
Neue Einträge können also ohne große Verzögerung angehängt werden, ungestört von der Datenbank-Aktion.