AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?
Thema durchsuchen
Ansicht
Themen-Optionen

TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

Ein Thema von uups · begonnen am 25. Apr 2019 · letzter Beitrag vom 26. Apr 2019
Antwort Antwort
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#1

TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

  Alt 25. Apr 2019, 20:48
Hallo!

Immer wieder lese ich von spürbaren Performance-Steigerungen durch den Einsatz von TMonitor anstelle von TCriticalSection. Es werden sogar per default die TMonitor-Klassenmetoden aufgerufen, wenn man die TCriticalSection in den plattformübergreifenden Anwendungen einsetzt. Dabei verstehe ich nicht ganz, wie der Schutzmechanismus von TMonitor funktioniert. Ich meine, im Fall der TCriticalSection erstelle ich für jeden zu schützenden Bereich eine eigene Instanz davon und betrete diese bei jedem Zugriff auf den "Schützling". Bei TMonitor werden immer nur die Klassenmethoden wie Enter und Exit aufgerufen (zumindest habe ich kein einziges Beispiel gefunden, wo es nicht der Fall wäre). Was passiert wenn ich mehrere zu schützende Variablen habe? Wie ekennt TMonitor, was zu schützen ist?

Auch erwarten die Enter() und Exit() von TMonitor einen TObject als Parameter. In allen Beispielen wird hier eine einfache, nur für diesen Zweck erstellte Instanz von TObject übergeben. Das verstehe ich auch nicht ganz.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

  Alt 25. Apr 2019, 20:55
Genau diese Objekt-Instanz ist es, die den Schutzmechanismus ausmacht.
Am Ende liegt jedes Objekt an seiner eindeutigen Speicheradresse. Und diese ist quasi der Schlüssel, anhand dessen die Klassenmethoden das Enter und Exit steuern. Daher ist es auch egal, ob Du ein TObject oder einen TButton als Nutzobjekt nutzt. Meist nimmt man da kleinste verfügbare - in Delphi eben das TObject.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#3

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

  Alt 25. Apr 2019, 21:33
@Daniel
Danke für die schnelle Reaktion!
Tur mir leid wenn meine Frage für einen Experten wie Dich jetzt etwas blöd klingt, aber wie trägt ein leeres, gerade erstelltes TObject zum Schutz einer Variable bei, die ihre eindeutige Speicheradresse ganz woanders hat? Z.B. hier ist ein Ausschnitt aus System.SyncObjs, diese Methoden werden aufgerufen, wenn man aus einer plattformübergreifenden Anwendung auf eine Instanz von TCriticalSection zufreift:

Delphi-Quellcode:
{ TCriticalSection.TCritSec }

procedure TCriticalSection.TCritSec.Initialize;
begin
  FSync := TObject.Create;
end;

procedure TCriticalSection.TCritSec.Free;
begin
  FSync.Free;
end;

procedure TCriticalSection.TCritSec.Enter;
begin
  TMonitor.Enter(FSync);
end;

procedure TCriticalSection.TCritSec.Leave;
begin
  TMonitor.Exit(FSync);
end;

function TCriticalSection.TCritSec.TryEnter: Boolean;
begin
  Result := TMonitor.TryEnter(FSync);
end;

edit: Die Frage oben war wirklich blöd. Ich glaube, ich habe es kapiert. Anstelle von TCriticalSection erstellt mann einen globales TObject, das zu schützenden Bereich markiert. Habe ich richtig verstanden?

Geändert von uups (25. Apr 2019 um 21:41 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.081 Beiträge
 
Delphi 12 Athens
 
#4

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

  Alt 26. Apr 2019, 09:50
Ja, ich verstehe die großen Unterschiede auch nicht so ganz.
CS ruft ja intern Montitor auf, wie Du unten zeigst.

Ich lege mir in manchen Klassen eine CS an, die dann wärend der ganzen LiveTimes der Klasse bestehen bleit.

Das ist womöglich ein kleines bischen mehr Overhead, aber woher die großen Performance-Unterschiede kommen sollen ist mir auch nicht klar.
Evtl. wenn man CS nur lokal benutzt, und immer wieder erzeugt und destroyed ?
Das wäre dann aber genauso schlecht bei dem Monitor.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

  Alt 26. Apr 2019, 10:09
Delphi-Quellcode:
  TCriticalSection = class(TSynchroObject)
{$IFDEF POSIX}
  private type
    TCritSec = record
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.081 Beiträge
 
Delphi 12 Athens
 
#6

AW: TMonitor: Klassenmethoden benutzen oder neue Instanz erstellen?

  Alt 26. Apr 2019, 10:30
Ja OK, ich mache wohl mittlerweile zuviel auf anderen Plattformen als Windows

Trotzdem könnte man doch auch hier einfach das gleiche Prinzip unter Windows verwenden,
oder was spricht dagegen ?

Wenn TMonitor soviel schneller ist, warum dann "TRTLCriticalSection = _RTL_CRITICAL_SECTION;" benutzen ?
Hat wohl historische Gründe.

Ich brauche in meinen Anwendungen selten das letzte Quentchen Performance, zum Glück.
  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 12:37 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