AW: Änderungen von Variablen synchronisieren
Zitat:
|
AW: Änderungen von Variablen synchronisieren
So, vielen Dank nochmal an alle. Ich habe nun alle wichtigen Operationen der TList (Add, Insert, Delete, Exchange, Clear) und natürlich das Umbenennen des Strings mit Hilfe von TCriticalSection in kritische Abschnitte gepackt. Die Performance ist nach wie vor gut.
Zitat:
Delphi-Quellcode:
While not(FCS.TryEnter) do InfiniteLoop;
... tue irgendetwas FSC.Leave |
AW: Änderungen von Variablen synchronisieren
Die Mühe bei der TList hättest du dir sparen können, wenn du einfach TThreadList benutzen würdest :)
BTW: Du solltest immer mit einem Schutzblock arbeiten:
Delphi-Quellcode:
und auch das ist eigentlich völlig überflüssig, weil du hiermit genau das gleiche erreichst wie mit
While not(FCS.TryEnter) do InfiniteLoop;
try ... tue irgendetwas finally FSC.Leave; end;
Delphi-Quellcode:
FCS.Enter; // Wartet so lange, bis die CS betreten werden kann
try ... tue irgendetwas finally FCS.Leave; end; |
AW: Änderungen von Variablen synchronisieren
TThreadlist hatte ich auch bereits gefunden. Allerdings fehlt dort Insert und Exchange oder habe ich etwas übersehen? Gut, das könnte man im Notfall noch selbst implementieren.
Zitat:
EDIT: Das geht ja anscheinend doch. Muss ich mir nochmal gründlich unter die Lupe nehmen. Man lernt eben nie aus. Vielen Dank für den Hinweis. |
AW: Änderungen von Variablen synchronisieren
Pollen ist hier leider die einzige Möglichkeit, wenn man ein TimeOut benötigt, also bei der CS.
Ansonsten müßte man auf Events (z.B. SetEvent oder TEvent) umsteigen. 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. |
AW: Änderungen von Variablen synchronisieren
Zitat:
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:
Der Vorteil hierbei ist, dass man bei Bedarf einen größeren Code-Block sperren kann, ansonsten muss ich mich um nichts kümmern.
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; 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? |
AW: Änderungen von Variablen synchronisieren
Zitat:
Delphi-Quellcode:
Procedure TMyList.Unlocklist; Begin MustLock:=True; //Liste muss später automatisch gesperrt werden FCS.Release; // erst jetzt darf ein anderer Thread an die Liste End; |
AW: Änderungen von Variablen synchronisieren
Zitat:
|
AW: Änderungen von Variablen synchronisieren
Erklär doch mal, wofür du das MustLock in LockList und UnlockList jeweils veränderst.
Das macht in meinen Augen keinen Sinn. |
AW: Änderungen von Variablen synchronisieren
Zitat:
Im Allgemeinen gilt, dass die CS sobald als möglich wieder freigegeben wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz