AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TCriticalSection in allen Methoden neu erstellen?
Thema durchsuchen
Ansicht
Themen-Optionen

TCriticalSection in allen Methoden neu erstellen?

Ein Thema von Pfoto · begonnen am 18. Dez 2006 · letzter Beitrag vom 18. Dez 2006
Antwort Antwort
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#1

TCriticalSection in allen Methoden neu erstellen?

  Alt 18. Dez 2006, 16:52
Hallo zusammen,

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
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

Re: TCriticalSection in allen Methoden neu erstellen?

  Alt 18. Dez 2006, 17:25
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

  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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