Delphi – TThreadSafe… para TStringList

Share Button

Quando se trabalha com processos paralelos o isolamento de memória com acesso comum a processos diferentes é fundamental.

Uma opção é implementar utilizando  TThreadList que mantem o controle da lista bloqueando ou liberando quando precisa acessar a área de armazenamento sem especialidades do TStringList .

De outro lado o TStringList não é threadsafe o que motiva a reescrever as funcionalidades para compartilhamento da lista entre os processos…   Ver Classes TThreadSafe….

  TThreadSafeStringList  
  //  public
    procedure Clear;
    function Count: integer;
    function IndexOf(AText: string): integer;
    function IndexOfName(AText: string): integer;
    procedure Add(AText: string; ADupl: boolean = true);
    procedure Delete(AIndex: integer);
    procedure Remove(AText: string);
    function LockList: TStringList;
    procedure UnlockList; inline;
    property Items[AIndex: integer]: string read Getitems write Setitems;
    property Delimiter: Char read GetDelimiter write SetDelimiter;
    property DelimitedText: string read GetDelimitedText write SetDelimitedText;
    function Text: string;
    property CommaText: string read GetCommaText write SetCommaText;
    property QuoteChar: Char read GetQuoteChar write SetQuoteChar;
    procedure Assing(AStrings: TStrings);
    procedure AssingTo(AStrings: TStrings);
    procedure AddTo(AStrings: TStrings);
    property Values[AName: string]: String read GetValues write SetValues;
    property Names[AIndex: integer]: String read GetNames write SetNames;

Exemplo de como utilizar as lista compartilhando em Threads diferentes mantendo o controle do acesso a lista… [Codigo]

{$R *.fmx}

procedure TForm2.Button1Click(Sender: TObject);
var
  x: integer;
begin
  strList.Clear;
  // Thread 1
  tthread.CreateAnonymousThread(
    procedure
    var
      x: integer;
    begin
      for x := 0 to random(1000) do
      begin
        strList.Add('X' + intToStr(x));
        tthread.Sleep(random(10));
      end;
      strList.Add('X-FIM');

      tthread.Queue(nil,
        procedure
        begin
          strList.AssingTo(Memo1.lines);
        end);

    end).start;

  // Thread 2
  tthread.CreateAnonymousThread(
    procedure
    var
      x: integer;
    begin
      for x := 0 to random(1000) do
      begin
        strList.Add('Z' + intToStr(x));
        tthread.Sleep(random(10));
      end;
      strList.Add('Z-FIM');

      tthread.Queue(nil,
        procedure
        begin
          strList.AssingTo(Memo1.lines);
        end);

    end).start;

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  strList := TThreadSafeStringList.create;

end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  strList.free;
end;