Hallo,
habe mich vor ein paar Tagen mit einigen aus dem Forum über Container und Threads unterhalten. Ich habe eine Containerklasse und ein Thread-Objekt erstellt. In der Containerklasse befindet sich ein Array, indem Daten vom Thread abgelegt und aufbereitet werden.
Das klappt alles wunderbar. Nur jetzt bekomme ich langsam das Problem, dass ich manchmal mehrere Threads gleichzeitig laufen habe, aber immer nur den gleichen Container. Ab un zu kommen Fehlermeldungen. Ich glaube, dass es Probleme gibt, wenn mehrere Threads auf das gleiche Array zugreifen und die Daten schnell nacheinander verändern. Denn das Hauptprogramm soll sich die Daten aus dem Array nehmen und anzeigen. Doch während es die Daten von Thread1 anzeigen möchte, hat Thread2 schon die Daten verändert und eine andere Struktur gespeichert. Nun kommt es zu AVs beim Anzeigen.
Nun ist die Frage, ob ich für jeden Thread einen eigenen Container erstellen soll und wann ich ihn dann freigeben soll? Nachteil wäre, dass ich wieder viele globale Container-Variablen habe, denn der Auftrag einen Thread zu erstellen und das Anzeigen der Daten sind in verschiedenen Methoden.
Ich hoffe, ihr versteht, was ich meine. Hier mal der Array-Code aus der Container-Klasse:
Delphi-Quellcode:
type
TExpData = Array of String;
type
TContainer=class(TSimpleRWSync)
private
FExpData: TExpData;
function getExpData(i: Integer): String;
function getExpDataCount: Integer;
public
procedure AddExpData(const Value: String);
procedure ClearExpData;
property ExpData[i: Integer]: String read getExpData;
property ExpDataCount: Integer read getExpDataCount;
end;
function TContainer.getExpData(i: Integer): String;
begin
BeginRead;
try
result:=FExpData[i];
finally
EndRead;
end;
end;
procedure TContainer.AddExpData(const Value: String);
begin
BeginWrite;
try
SetLength(FExpData, Succ(Length(FExpData)));
FExpData[High(FExpData)]:=Value;
finally
EndWrite;
end;
end;
procedure TContainer.ClearExpData;
begin
BeginWrite;
try
SetLength(FExpData, 0);
finally
EndWrite;
end;
end;
function TContainer.getExpDataCount: Integer;
begin
result:=High(FExpData);
end;
Danke im Voraus