Einzelnen Beitrag anzeigen

Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#1

TThreadStringList

  Alt 9. Mär 2010, 21:43
Guten Abend,

da ich einem Projekt mit Threads arbeite und dazu auch aus den Threads
auf eine StringList zugegriffen wird, möchte ich diese gerne Threadsafe machen.
Leider kann ich die Klasse nicht vollständig bei mir testen - ich habe nur eine Single core
System - da hatte auch der 'nicht Thread safe" Zugriff keine Probleme bereitet.
Das Zielsystem ist aber eine Mehrprozessormaschine.
Auch die ThreadStringList läuft auf meinem single core System.

Daher meine Frage, kann mal wer über die Klasse schauen und Kritik üben.
Bin mir nicht sicher ob nicht ein paar grobe Schnitzer drin sind.

Delphi-Quellcode:
unit UThreadStringList;

interface
uses
  classes,syncObjs,sysUtils;

type

  TThreadStringList = class
    private
      FStringList : TStringList;
      FCriticalSection : TCriticalSection;
    public
      constructor create;
      destructor destroy;
      function lockStringList:TStringList;
      procedure unlock;
      procedure add(AItem: AnsiString);
      function get(AIdx: Integer): AnsiString;
      procedure saveToFile(AFilePath: AnsiString);
      procedure remove(AIdx: Integer);
      function count:Integer;
    end;

implementation

constructor TThreadStringList.create;
begin
  FStringList := TStringList.Create;
  FCriticalSection := TCriticalSection.create;
end;

destructor TThreadStringList.destroy;
begin
  freeAndNil(FStringList);
  freeAndNil(FCriticalSection);
end;

function TThreadStringList.lockStringList:TStringList;
begin
  FCriticalSection.Acquire;
  result := FStringList;
end;

procedure TThreadStringList.unlock;
begin
  FCriticalSection.Release;
end;

procedure TThreadStringList.add(AItem: AnsiString);
var
  sl : TStringList;
begin
  sl := lockStringList;
  sl.Add(AItem);
  unlock;
end;

function TThreadStringList.get(AIdx: Integer): AnsiString;
var
  sl : TStringList;
begin
  sl := lockStringList;
  result := sl[AIdx];
  unlock;
end;

procedure TThreadStringList.saveToFile(AFilePath: string);
var
  sl : TStringList;
begin
  sl := lockStringList;
  try
    sl.SaveToFile(AFilePath);
  finally
    unlock;
  end;
end;

procedure TThreadStringList.remove(AIdx: Integer);
var
  sl : TStringList;
begin
  sl := lockStringList;
  sl.Delete(AIdx);
  unlock;
end;

function TThreadStringList.count:Integer;
var
  sl : TStringList;
begin
  sl := lockStringList;
  result := sl.count;
  unlock;
end;

end.
Danke für das Lesen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat