Zitat von
himitsu:
Beim Pollen muß meventuell an aufpassen, daß man nicht die CPU hochtreibt.
Ich bei da Pausen in die Schleife, so mit je um die 20 Millisekunden.
Aber dort kann man sich unter umständen auch aussperren, wenn zwei/mehrere Threads in schneller Follge drauf zugreifen und zwischen 2 Zugriffen die Zeit kürzer ist, als die Pause.
Da reicht sogar schon eine Millisekunde aus
Hatte ich die letzten Tage mal selbst getestet. Hatte das ganz falsch verstanden. Dachte, das Enter wartet genauso wenig wie das TryEnter. Habs jetzt erstmal ohne Pollen umgesetzt.
Und zwar habe ich mir eine einfache threadsichere Klasse (mit CriticalSections) gebaut, die sich um alles kümmert. Ich weiss, dafür gibts die ThreadList, die fand ich von der Schreibarbeit jedoch auch nicht wesentlich angenehmer. In meiner Klasse überlasse ich es dem Benutzer, ob er die Liste manuell sperren möchte oder ob dies automatisch geschieht.
Delphi-Quellcode:
interface
Uses Classes, SysUtils, SyncObjs;
type
TMyList = class
private
MyList:TList;
FCS : TCriticalSection;
MustLock:Boolean; //Liste muss gesperrt werden
Procedure Lock; //Internes Sperren
Procedure Unlock; //Internes Freigeben
public
Procedure Locklist; //Manuell sperren
Procedure Unlocklist; //Manuell freigeben
Constructor Create;
Destructor Destroy;
Function Count:Integer;
...
end;
implementation
Constructor TMyList.Create;
Begin
MyList:=TList.Create;
FCS := TCriticalSection.Create;
MustLock:=True; //Liste muss automatisch gesperrt werden
End;
Procedure TMyList.Lock;
Begin
IF MustLock then
FCS.Enter;
End;
procedure TMyList.Unlock;
begin
IF MustLock then
FCS.Release;
end;
Procedure TMyList.Locklist;
Begin
FCS.Enter;
MustLock:=False; //Liste muss später NICHT automatisch gesperrt werden
End;
Procedure TMyList.Unlocklist; //EDIT: Reihenfolge der Codezeilen wurde getauscht
Begin
MustLock:=True; //Liste muss später automatisch gesperrt werden
FCS.Release;
End;
Function TMyList.Count:Integer;
Begin
lock;
try
Result:=MyList.Count;
finally
unlock;
end;
End;
Der Vorteil hierbei ist, dass man bei Bedarf einen größeren Code-Block sperren kann, ansonsten muss ich mich um nichts kümmern.
Mal noch ne letzte Frage, wenn man in einer Schleife mehrere Items aus der Liste löscht, ist es dann besser, die komplette Schleife zu sprerren oder nur die einzelnen Delete?