![]() |
Delphi-Version: XE2
Properties, ihre Getter und Setter und Thread-Safety
Die von Ärzten empfohlene tägliche Dosis von Themen zu Threads ist bereits überschritten, ich weiß :oops:
Aber bislang sind (auch in anderen Sprachen und Umgebungen) viele Dinge (darunter auch Properties überhaupt) an mir vorbeigezogen, deshalb die Frage. Sachstand:
Problem/Frage:
Was soll ich tun? Kann mir irgendeine geheime Property-Magie helfen? :| |
AW: Properties, ihre Getter und Setter und Thread-Safety
Also für Faule gibt es z.B. folgende Lösung
Delphi-Quellcode:
Benutzung:
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.
Delphi-Quellcode:
UPDATE
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; 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. ![]() ![]() |
AW: Properties, ihre Getter und Setter und Thread-Safety
Das ist aber gewitzt :-D - 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
Delphi-Quellcode:
scheint auf den ersten Blick dann auch dafür die Lösung zu sein - Anscheinend der void-Datentyp Delphis :-D
TValue
|
AW: Properties, ihre Getter und Setter und Thread-Safety
Zitat:
Zitat:
Delphi-Quellcode:
try finally
Zitat:
|
AW: Properties, ihre Getter und Setter und Thread-Safety
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
Delphi-Quellcode:
mit einem auf
Single
Delphi-Quellcode:
typisierten Getter/Setter verkuppeln.
TValue
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... :pale: Aber darauf wird es im Endeffekt wohl hinauslaufen, vielen Dank für die Hilfe! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz