![]() |
TCriticalSection in allen Methoden neu erstellen?
Hallo zusammen, :hi:
Da ich eine Liste thread-sicher abarbeiten will, sollen die Methoden Add / Delete / clear etc. durch TCriticalSection geschützt werden. Nun meine vielleicht dumme Frage: Muss ich in jeder Methode eine eigene Variable mit TCriticalSection initialisieren? Da doch verschiedene Threads zu gleichen Zeit in verschiedene Methoden springen könnten... Beispiel:
Delphi-Quellcode:
Type
TListe = class(TList) private fCSAdd: TCriticalSection; fCSDelete: TCriticalSection; public .... end; ....... implementation procedure TListe.Add(AItem: String); begin fCSAdd.Enter; try // Hier Methode Add finally fCSAdd.Leave; end; end; procedure TListe.Delete(AItem: String); begin fCSDelete.Enter; try // Hier Methode Delete finally fCSDelete.Leave; end; end; So recht kapiere ich nämlich nicht, wie ein Objekt (TCriticalSection) einen Thread intern bremsen kann, wenn schon ein anderer in der Methode arbeitet... schon gar nicht, wenn das gleiche Objekt dies für alle Methoden des Elternobjektes gewährleisten muss. Danke für Eure Hilfe Pfoto |
Re: TCriticalSection in allen Methoden neu erstellen?
Du musst die CriticalSection nur einmal erstellen, und zwar im Constructor deiner Klasse. In den Methoden dann wie du es scheinbar schon machst .Enter und .Leave verwenden. Mehr Arbeit solltest du damit nicht haben.
die CriticalSection sperrt dann einfach für jeden anderen Thread den Zugriff auf die Section, solange bis sie mit .Leave sozusagen wieder für den gebrauch freigegeben wird. Der nächste Thread ruft dann die MEthode auf, in der eben wieder ein .Enter implementiert ist und somit wird die Section wieder geschlossen, das ist alles ;) Nicht vergessen, die CriticalSection im Destructor der Klasse wieder freigeben :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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