Einzelnen Beitrag anzeigen

HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#6

AW: Arbeiten mit TThreadlist

  Alt 20. Jan 2017, 05:52
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.
  Mit Zitat antworten Zitat