Einzelnen Beitrag anzeigen

Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Mehrere Container für mehrere Threads?

  Alt 28. Feb 2008, 15:28
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
  Mit Zitat antworten Zitat