Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Criticalsection Aquire vs Enter (https://www.delphipraxis.net/178723-criticalsection-aquire-vs-enter.html)

Shark99 23. Jan 2014 11:57

Criticalsection Aquire vs Enter
 
Was ist der Unterschied zwischen Aquire und Enter bei einer CriticalSection?

In der Hilfe heisst es "Enter calls the Acquire method", also kann es nicht das Gleiche sein.

grl 23. Jan 2014 12:10

AW: Criticalsection Aquire vs Enter
 
Doch, es ist das gleiche - zumindest bei Delphi 7.

Da ruft TCriticalSection.Enter Aquire auf - und sonst nix.

also so:
Delphi-Quellcode:
procedure TCriticalSection.Enter;
begin
  Aquire;
end;
Zu finden in SyncObjs.pas

Gruß
GRL

jaenicke 23. Jan 2014 12:12

AW: Criticalsection Aquire vs Enter
 
Und Aquire ruft wiederum Enter der dahinterstehenden API-Kapselung (TRTLCriticalSection für Windows, TCritSec für den Rest) auf.

Steht aber alles wie grl schon geschrieben hat im Quelltext.

Der schöne Günther 23. Jan 2014 12:16

AW: Criticalsection Aquire vs Enter
 
In XE5 das gleiche. Reines Synonym.

Interessant ist aber das Bestehen einer Helperklasse
Delphi-Quellcode:
TCriticalSectionHelper
welche wieder von Acquire aufgerufen wird:

Delphi-Quellcode:
procedure TCriticalSection.Acquire;
begin
  FSection.Enter;
end;
FSection ist ein Alias für den Record
Delphi-Quellcode:
Winapi.Windows._RTL_CRITICAL_SECTION
und die Helperklasse greift mit folgenden Methoden ihm unter die Arme:

Delphi-Quellcode:
  TCriticalSectionHelper = record helper for TRTLCriticalSection
    procedure Initialize; inline;
    procedure Destroy; inline;
    procedure Free; inline;
    procedure Enter; inline;
    procedure Leave; inline;
    function TryEnter: Boolean; inline;
  end;
mit

Delphi-Quellcode:
procedure TCriticalSectionHelper.Enter;
begin
  EnterCriticalSection(Self);
end;
Das geht (zumindest unter Windows) auf die kernel32.dll:
Delphi-Quellcode:
procedure EnterCriticalSection; external kernel32 name 'EnterCriticalSection';
Hoffe, das hilft dir beim nächsten Fernsehquiz weiter :-D

The more you know...

jaenicke 23. Jan 2014 13:02

AW: Criticalsection Aquire vs Enter
 
Der Grund dafür ist einfach:
Der Record TCritSec für andere Systeme als Windows hat einfach die gleichen Methoden, so dass man beides ansonsten gleich schreiben kann. Eine gute Idee muss ich sagen. :thumb:

Panthrax 24. Jan 2014 00:53

AW: Criticalsection Aquire vs Enter
 
  • Delphi-Quellcode:
    Aquire
    wird umbenannt in
    Delphi-Quellcode:
    Enter
  • Delphi-Quellcode:
    Release
    wird umbenannt in
    Delphi-Quellcode:
    Leave
Ein Blick in die Herkunft der Methoden hilft verstehen:
Delphi-Quellcode:
type
  TSynchroObject = class(TObject)
    procedure Acquire; virtual;
    procedure Release; virtual;
  end;
Ein Synchronisationsobjekt wird beschlagnahmt oder freigelassen.
Delphi-Quellcode:
type
  TCriticalSection = class(TSynchroObject)
    procedure Enter; inline;
    procedure Leave; inline;
  end;
Ein kritischer Abschnitt wird betreten oder verlassen.

Es wird sprachliche Konsistenz hergestellt.

Unsere Sprache ist unsere Welt in der wir zu denken vermögen. Sie ist wichtig und bedarf der Pflege.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 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