Jupp, TList ist nicht threadsicher.
(Wenn auf irgendwas nur innerhalb
irgendeines Threads und nur in diesem, zugegriffen wird, dann muß man nichts absichern)
PS: um Daten einer Liste abzuarbeiten, hatt ich mir mal dieses gebastelt
http://www.delphipraxis.net/internal...t.php?t=167796
Zitat:
Das Problem war nun, dass beim Aufruf von z.B. AddData() der Main Thread dauerhaft blockiert wurde, die CriticalSection im Thread also scheinbar nie released wurde.
erstmal der Resourcen-Schutzblock:
Delphi-Quellcode:
while not Terminated do
begin
CS.Enter;
try
for I := 0 to FList.Count - 1 do
begin
// blabla ..
end;
finally
CS.Leave;
end;
end;
Denn wenn etwas passiert (z.B. eine
Exception), dann wird da wirklich kein .Leave aufgerufen.
Und dann rufst du praktisch direkt nach dem .Leave fast sofort wieder .Enter auf.
Wenn also hier Windows nicht rein zufällig an dieser Stelle eine Pause einlegt und den anderen Threads so überhaupt die Möglichkeit gibt hier einzusteigen, dann kann auch nie ein anderer Thread an der Stelle die CS "übernehmen".
Delphi-Quellcode:
while not Terminated do
begin
CS.Enter;
try
for I := 0 to FList.Count - 1 do
begin
// blabla ..
end;
finally
CS.Leave;
end;
Sleep(0);
end;
0 gibt nur für einen "Zyklus" die Kontrolle ab,
so daß die anderen Threads überhaupt 'ne Chance bekommen.
Unter Umständen könnte hier aber auch eine noch längere Pause hilfreich sein.