Delphi: Hoe maak je een Thread Safe global TList?

Hoe maak je een Thread Safe wereldwijde TList?

unit Unit1;
interface
uses
    ...;
type
  TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;
  global_TList: TList;//Not thread safe?

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
// something
end;

end.

Ik heb twee threads, die kunnen schrijven naar global_TList, maar zoals ik weet, is deze niet thread safe.

Dus hoe maak je het veilig?

Delphi 2010, Indy 10, Win7

8
toegevoegd de auteur Warren P, de bron
Zie Delphi Help voor een voorbeeld van hoe u met een TThreadList werkt.
toegevoegd de auteur LU RD, de bron

1 antwoord

Gebruik TThreadList. Probleem opgelost.

19
toegevoegd
Dat is waarvoor TThreadList is gebouwd. TThreadList is geen lijst met threads, het is een TList die veilig kan worden gebruikt vanuit meerdere threads tegelijkertijd.
toegevoegd de auteur dthorpe, de bron
U hebt geen toegang tot de telling van de inhoud van de lijst, terwijl andere threads mogelijk de lijst kunnen bijwerken en de telling kunnen wijzigen. Dat betekent dat het telnummer dat u zojuist hebt gekregen zinloos is. In plaats daarvan biedt TThreadList een "check-out" -model - u kunt het beschermde lijstobject alleen verkrijgen door de threadlijst te vergrendelen. Geen andere threads kunnen de threadlijst gebruiken totdat u deze ontgrendelt. Gebruik try/finally om ervoor te zorgen dat je altijd ontgrendelt wat je vergrendelt.
toegevoegd de auteur dthorpe, de bron
Schrijf geen code zoals threadlist.LockList.Count. Dat is vragen om problemen - het is gemakkelijk om te vergeten dat je threadlist.UnlockList moet bellen om het slot vrij te geven zodat andere threads de lijst kunnen gebruiken. roep threadlist.LockList op en wijs het resultaat toe aan een variabele, start een try-blok en gebruik de lijstvariabele in het try-blok, en sluit af met een finally die threadlist oproept.UnlockList
toegevoegd de auteur dthorpe, de bron
Kan ik TThreadList in thread gebruiken?
toegevoegd de auteur waza123, de bron
Bedankt !! Ik stoer het is een kastje. Maar er is geen propertie .count, hoe te tellen?
toegevoegd de auteur waza123, de bron
Gevonden ... THreadList.LockList.Count;
toegevoegd de auteur waza123, de bron