Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Kurze Frage zur Thread Sicherheit

  Alt 5. Okt 2012, 01:51
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)
  Mit Zitat antworten Zitat