AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Properties, ihre Getter und Setter und Thread-Safety

Properties, ihre Getter und Setter und Thread-Safety

Ein Thema von Der schöne Günther · begonnen am 15. Mär 2013 · letzter Beitrag vom 15. Mär 2013
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
5.117 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Properties, ihre Getter und Setter und Thread-Safety

  Alt 15. Mär 2013, 14:38
Delphi-Version: XE2
Die von Ärzten empfohlene tägliche Dosis von Themen zu Threads ist bereits überschritten, ich weiß

Aber bislang sind (auch in anderen Sprachen und Umgebungen) viele Dinge (darunter auch Properties überhaupt) an mir vorbeigezogen, deshalb die Frage.

Sachstand:
  • Ich habe eine Klasse mit ein paar Membern (sowohl PODs als auch Strings und andere Klassen)
  • Diese Klasse hat auch einen TThread (als innere Klasse) der ab und zu die Member der äußeren Klasse aktualisiert


Problem/Frage:
  1. Ich habe nicht wirklich Lust, für alle jetzigen und noch kommenden Member manuell eigene TCriticalSection s zu definieren.
  2. Selbst wenn ich eine TCriticalSection für alle Member recycle, müsste ich doch immer noch für jeden Member eine Property mit eigenem Getter und Setter bauen in der dann ständig der kritische Abschnitt betreten und verlassen wird. Selbst wenn ich (sinnvollerweise) stattdessen einen TMultiReadExclusiveWriteSynchronizer (den ich mir noch nicht angesehen habe) benutzen würde - Das Gefummel mit den Properties bliebe wohl.


Was soll ich tun? Kann mir irgendeine geheime Property-Magie helfen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Properties, ihre Getter und Setter und Thread-Safety

  Alt 15. Mär 2013, 15:05
Also für Faule gibt es z.B. folgende Lösung
Delphi-Quellcode:
unit CSLazy;

interface

uses
  SyncObjs;

type
  ICS = interface
    ['{C1D6A40D-14CA-4E33-8FF7-CD0A01385343}']
    procedure Enter;
    function TryEnter : Boolean;
    procedure Leave;
  end;

function CS( ACS : TCriticalSection ) : ICS;

implementation

type
  TCS = class( TInterfacedObject, ICS )
  private
    FCS : TCriticalSection;
    FEntered : Boolean;
  protected
    procedure Enter;
    function TryEnter : Boolean;
    procedure Leave;
  public
    constructor Create( ACS : TCriticalSection );
    destructor Destroy; override;
  end;

function CS( ACS : TCriticalSection ) : ICS;
begin
  if Assigned( ACS )
  then
    Result := TCS.Create( ACS )
  else
    Result := nil;
end;

{ TCS }

constructor TCS.Create( ACS : TCriticalSection );
begin
  inherited Create;
  FCS := ACS;
end;

destructor TCS.Destroy;
begin
  if FEntered
  then
    FCS.Leave;

  inherited;
end;

procedure TCS.Enter;
begin
  FCS.Enter;
  FEntered := True;
end;

procedure TCS.Leave;
begin
  FCS.Leave;
  FEntered := False;
end;

function TCS.TryEnter : Boolean;
begin
  Result := FCS.TryEnter;
  FEntered := Result;
end;

end.
Benutzung:
Delphi-Quellcode:
type
  TMyThread = class( TThread )
  private
    FCS : TCriticalSection;
    FValue : string;
    function GetValue : string;
    procedure SetValue( const Value : string );
  public
    property Value : string read GetValue write SetValue;
  end;

function TMyThread.GetValue : string;
begin
  CS( FCS ).Enter;
  Result := FValue;
end;

procedure TMyThread.SetValue( const Value : string );
begin
  CS( FCS ).Enter;
  FValue := Value;
end;
UPDATE

Du könntest auch über indizierte Properties gehen, dann hast du nur einen Getter/Setter für alle (gut der Typ muss gleich sein, wobei ja auch z.B. Delphi-Referenz durchsuchenTValue oder Delphi-Referenz durchsuchenVariant als Typ möglich wären).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (15. Mär 2013 um 15:23 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.117 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Properties, ihre Getter und Setter und Thread-Safety

  Alt 15. Mär 2013, 15:22
Das ist aber gewitzt - Einfach mal so ein Objekt erzeugen dass im Konstruktor den kritischen Abschnitt betritt um dann mit seinem Destruktor wieder herauszuhüpfen. Da das auch das einzige ist was hier im Getter/Setter der Property passiert wird der ja auch fix wieder aufgerufen.

Das ist schonmal ein echter Zaubertrick, Danke dafür!

Was mich nach wie vor etwas unbefriedigt zurücklässt ist die Tatsache, dass ich nicht einmal deb "Einer erschlägt alles" Getter/Setter schreiben kann - Für eine zweite Instanzvariable neben FValue (z.B. vom Typ Single) wären nach wie vor wieder ein Getter und Setter fällig. Da liegt der Hund begraben!

Edit
Und TValue scheint auf den ersten Blick dann auch dafür die Lösung zu sein - Anscheinend der void-Datentyp Delphis

Geändert von Der schöne Günther (15. Mär 2013 um 15:25 Uhr) Grund: Ninja
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Properties, ihre Getter und Setter und Thread-Safety

  Alt 15. Mär 2013, 15:26
Das ist aber gewitzt - Einfach mal so ein Objekt erzeugen dass im Konstruktor den kritischen Abschnitt betritt um dann mit seinem Destruktor wieder herauszuhüpfen. Da das auch das einzige ist was hier im Getter/Setter der Property passiert wird der ja auch fix wieder aufgerufen.
Das macht meine Klasse jetzt ja so nicht, aber wäre auch möglich
Das ist schonmal ein echter Zaubertrick, Danke dafür!
Das sind halt Interfaces - Da erledigt sich auch sofort das lästige try finally
Was mich nach wie vor etwas unbefriedigt zurücklässt ist die Tatsache, dass ich nicht einmal deb "Einer erschlägt alles" Getter/Setter schreiben kann - Für eine zweite Instanzvariable neben FValue (z.B. vom Typ Single) wären nach wie vor wieder ein Getter und Setter fällig. Da liegt der Hund begraben!
Dazu schau dir mal mein Update an
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.117 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Properties, ihre Getter und Setter und Thread-Safety

  Alt 15. Mär 2013, 15:55
Ich habe es bis gerade noch auf Biegen und Brechen (z.B. über generische Methoden als Property-Getter/Setter) versucht, aber er lässt mich noch nicht einmal eine Property vom Typ Single mit einem auf TValue typisierten Getter/Setter verkuppeln.

Bliebe nur der langsame Weg über RTTI oder indizierte Properties welcher meiner Meinung nach absolut hässlich sind. Wenn ich mal ohne die Properties direkt auf die Felder zugreifen möchte muss ich mir entweder mühsam einzelne Zahlen aus der Klassendeklaration buddeln oder hoffen, dass man hier mit Enumerationstypen die Indizes wenigstens etwas aufhübschen kann. Großer Gott...

Aber darauf wird es im Endeffekt wohl hinauslaufen, vielen Dank für die Hilfe!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf