![]() |
AW: Änderungen von Variablen synchronisieren
Zitat:
Aus diesem Grund setze ich bei TMyList.Locklist MustLock:=False. Das bedeutet, dass ich z.B. innerhalb von Count keine CriticalSection mehr starten muss, da schon aktiv
Delphi-Quellcode:
Also wird der Code in Count ausgeführt.
IF MustLock then Lock
|
AW: Änderungen von Variablen synchronisieren
Ja, sowas hatte ich mir gedacht :)
Aber das ist überflüssig und verkompliziert die Sache unnötig. Eine CriticalSection sorgt dafür, das innerhalb selbiger nur ein ThreadKontext aktiv ist. Innerhalb dieses ThreadKontextes kann eine CS aber beliebig oft betreten werden. Die CS muss aber auch genauso oft wieder verlassen werden damit diese wieder frei für einen anderen ThreadKontext ist.
Delphi-Quellcode:
Diese Konstrukt funktioniert problemlos, denn wenn die CS betreten werden kann, dann funktioniert auch das zweite Betreten.
FCS.Enter;
FCS.Enter; TuWas; FCS.Leave; FCS.Leave; |
AW: Änderungen von Variablen synchronisieren
Alles klar :thumb: Danke, man lernt eben nie aus. Das Thema Threads wird mir noch die ein oder andere schlaflose Nacht bescheren (absolutes Neuland für mich) :roll:
|
AW: Änderungen von Variablen synchronisieren
Und das Try-Finally nicht vergessen, denn die CS muß eben unbedingt genau so oft verlassen/freigegeben werden, wie sie betreten/gesperrt wurde.
|
AW: Änderungen von Variablen synchronisieren
Zitat:
Delphi-Quellcode:
Function TMyList.Count:Integer;
Begin lock; try Result:=MyList.Count; finally unlock; end; End; |
AW: Änderungen von Variablen synchronisieren
Und das 'lock' bzw. 'unlock' sieht wie aus?
|
AW: Änderungen von Variablen synchronisieren
Zitat:
:stupid: :pale: :oops: |
AW: Änderungen von Variablen synchronisieren
Wozu das MustLock?
Erstmal das von Blup Genannte und wenn sich zwischen Lock und Unlock das MustLock ändert, dann stimmt die Anzahl auch nicht mehr. Im Prinzip ist das LockList/UnlockList umsonst, außerdem fehleranfällig und Lock/Unlock alleine reicht auch schon aus. |
AW: Änderungen von Variablen synchronisieren
Zitat:
Delphi-Quellcode:
Sir Rufo hat mich schon darauf hingewiesen, dass das Mustlock überflüssig ist.
MyList.Locklist;
Dateiinfo:=Leseausdatei(MyList.Item[5].FileName); //Leseausdatei ist kein Bestandteil der Klasse //Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item[5] über MyList.Delete(5) gelöscht wird. Mylist.Item[5].Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert. MyList.LockList; EDIT: Zitat:
|
AW: Änderungen von Variablen synchronisieren
Das geht ja dennoch.
Delphi-Quellcode:
Wenn du Mustlock entfernst, wirst du bemerken, daß Lock=LickList und Unlock=UnlockList.
MyList.Lock;
try Dateiinfo:=Leseausdatei(MyList.Item[5].FileName); //Leseausdatei ist kein Bestandteil der Klasse //Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item[5] über MyList.Delete(5) gelöscht wird. Mylist.Item[5].Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert. finally MyList.Unlock; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz