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)