Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TCriticalSection in allen Methoden neu erstellen? (https://www.delphipraxis.net/82708-tcriticalsection-allen-methoden-neu-erstellen.html)

Pfoto 18. Dez 2006 16:52


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

Meflin 18. Dez 2006 17:25

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 18:20 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