Thema: Delphi Threads - Einstellbar

Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

Re: Threads - Einstellbar

  Alt 24. Mär 2010, 22:50
Hier wird erklärt, was ein Stack überhaupt ist. Man kann Elemente darauf werfen und wieder davon herunter holen. Die Frage ist, ob du sowas brauchst, oder nicht eher eine Queue. Es ändert sich die Reihenfolge, in der die Elemente einzeln geholt werden. Wenn du diese beiden Konstrukte nicht kennst, dann würde ich dir echt empfehlen es zu lesen.

Hier mal eine erweiterte StringList. Wenn Fehler auftauchen, musst selbst danach schauen. Ist hier einfach schnell runter programmiert.
Delphi-Quellcode:
TThreadSaveStackStringList = class(TStringList)
private
  FCriticalSection : TCriticalSection; // es brauch hierfür ein Eintrag in der uses-Klausel
public
  procedure Push(const AStr: String);
  function Pop(): String;
  constructor Create(); // irgnedwas kommt hier noch in Klammern ;)
  destructor Destroy();
end;

procedure TThreadSaveStackStringList.Push(const AStr: String);
begin
  FCriticalSection.Enter();
  try
    // für Stack
    Self.Insert(0, AStr); // oder gehört die Parameter tauschen


    // für Queue
    //Self.Add(AStr);
  finally
    FCriticalSection.Leave();
  end;
end;

function TThreadSaveStackStringList.Pop(): String
begin
  FCriticalSection.Enter();
  try
    Result := ''; // Leerstring wird ausgegeben, wenn keine Elemente vorhanden sind
    if (Self.Count > 0) then
    begin
      Result := Self[0];
      Delete(0);
    end;
  finally
    FCriticalSection.Leave();
  end;
end;

constructor TThreadSaveStackStringList.Create();
begin
  inherited Create();
  FCriticalSection := TCriticalSection.Create();
end;

destructor TThreadSaveStackStringList.Destroy();
begin
  FreeAndNil(FCriticalSection);
  inherited Destroy();
end;
Du kannst nun alle Threads auf die beiden Methoden Push und Pop zugreifen lassen und es kommt eigentlich nie zu Problemen. Das regelt die CriticalSection. Es darf sich hierbei nur ein Thread innerhalb von den Zeilen zwischen Enter und Leave befinden, dazu findest viel im Forum.

Du darfst hierbei auch nur Push und Pop nutzen, um auf die Strings zuzugreifen. Besser wäre es sogar, wenn man die StringList kapselt, bin aber zu faul das jetzt noch umzuprogrammieren Vielleicht gibts auch schon einen TStack, schau einfach mal.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat