Autor |
Beitrag |
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Sa 18.10.08 22:44
Hallo.
Ich stehe vor dem Problem, dass ich eine Klasse habe (im Moment noch von TObject abgeleitet). Dieser Klasse übergebe ich beim Create ein paar Dinge. Danach werkelt das Objekt vor sich hin (mit einem Timer). Es werden ein paar Schritte abgearbeitet, die ein bisschen dauern. Danach sollte sich das Objekt selber wieder freigeben. Ich kann nämlich nicht beim Aufruf drauf warten, dass das Objekt zu einem Ende kommt und es dann mit einem Free freigeben.
Wie kann ich bewerkstelligen?
Danke,
Matze
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 18.10.08 22:50
Dann lass dass Objekt doch und gib es am Schluss im formclose frei.
Da muss es ja wohl fertig sein.
Oder habe ich jetzt was falsch verstanden und nur Unsinn gepostet??
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Sa 18.10.08 22:55
TThread hat doch eine Eigenschaft, FreeOnTerminate. Die könntest du dir vielleicht abgucken?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 18.10.08 23:02
Also direkt freigeben kann sich ein Objekt meines Wissens nach nicht.
Meine Idee dazu, kp ob sie praktikabel ist:
Dein Objekt vollbringt seine Aufgaben und erstellt am Ende ein neues Objekt, dieses 2. Objekt gibt das erste frei und wird seinerseits vom Hauptprogramm freigegeben (musst ja nur ab und zu nachschauen ob das 2te Objekt existiert).
|
|
Fabian E.
      
Beiträge: 554
Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
|
Verfasst: Sa 18.10.08 23:04
Ist es evntuell möglich Jann1ks Methode mit einer Prozedur durchzufühern?Wenn deine Instanz frtig ist, ruft sie eine Methode auf der sie sich selbst als Parameter über gibt. Diese Methode gibt dann den Parameter (deine Instanz) frei.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: So 19.10.08 09:14
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 19.10.08 09:26
Es sollte kein Problem sein, sofern nach der Selbstzerstörung nicht mehr auf Objektresourcen zugegriffen wird.
Delphi-Quelltext 1: 2: 3: 4: 5:
| Procedure TSuicidalObject.Execute; Begin Live; Self.Free; End; |
Denn der Code existiert ja noch.
_________________ Na denn, dann. Bis dann, denn.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: So 19.10.08 09:45
Ja cool. Es funktioniert. Ich hätte immer gedacht, dass so etwas nicht geht. Aber es geht doch
Vielen Dank!
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 19.10.08 12:30
Hier siehst du einen Auszug aus der Delphi-Hilfe zu dem Thema:
www.delphi-forum.de/....php?p=529282#529282
Bei normalen Objekten geht es wohl, bei visuellen Komponenten zumindest nicht.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 19.10.08 13:15
matze hat folgendes geschrieben : | Ja cool. Es funktioniert. Ich hätte immer gedacht, dass so etwas nicht geht. Aber es geht doch
Vielen Dank! |
Man muss dabei immer nur aufpassen, dass es auf das freizugende Objekt keine Referenzen gibt.
Und genau das ist der Punkt mit visuellen Komponenten ... Wobei selbst das geht. Dort ist es aber nicht Free, sondern Release.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 19.10.08 13:23
BenBE hat folgendes geschrieben : | Man muss dabei immer nur aufpassen, dass es auf das freizugende Objekt keine Referenzen gibt. |
Daher würde ich noch ein Singleton-Pattern drumherum bauen.
_________________ Na denn, dann. Bis dann, denn.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Mo 20.10.08 10:12
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 20.10.08 10:27
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 20.10.08 10:33
Bei einem Singleton verfrachtest Du den Konstrutor in die Private/Protected Sektion und veröffentlichst stattdessen eine Class Function 'Create', die das Objekt maximal einmal erzeugt und eine globale Instanz (das 'Singleton') liefert :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| Type TSingleton = Class protected Constructor _Create; public Class Function Create : TSingleton; Destructor Destroy; Override; End;
implementation
Var GlobalSingletonInstance : TSingleton;
Constructor TSingleton._Create; Begin End;
Class Function TSingleton.Create : TSingleton; Begin If not Assigned (GlobalSingletonInstance) Then GlobalSingletonInstance := TSingleton._Create; Result := GlobalSingletonInstance End;
Destructor TSingleton.Destroy; Begin Inherited; GlobalSingletonInstance := Nil; ... Initialization GlobalSingletonInstance := Nil Finalization GlobalSingletonInstance.Free; End. |
Das ist natürlich noch nicht die perfekte Version, da 'unwissende' Anwender das Objekt freigeben würden, was eventuell unerwünscht wäre. Daher könntest Du noch den Destruktor verbergen und durch eine Prozedur ersetzen, die über einen Referenzzähler erst den letzten Aufruf an den Destruktor weiterleitet. Allerdings müsste die 'Free'-Prozedur überschrieben werden.
Hier also eine mögliche Delphi-Implementierung:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| Uses Windows; Type TSingleton = Class private _RefCount: Integer;
protected Constructor _Create; Destructor _Destroy; public Class Function Create: TSingleton; Procedure Destroy; Procedure Free; End;
Implementation Var GlobalSingletonInstance: TSingleton;
Procedure TSingleton.Destroy; Begin If InterlockedDecrement(_RefCount) = 0 Then _Destroy; End;
Constructor TSingleton._Create; Begin _RefCount := 0; End;
Class Function TSingleton.Create: TSingleton; Begin If Not Assigned(GlobalSingletonInstance) Then GlobalSingletonInstance := TSingleton._Create; InterlockedIncrement(GlobalSingletonInstance._RefCount); Result := GlobalSingletonInstance End;
Destructor TSingleton._Destroy; Begin Inherited; GlobalSingletonInstance := Nil; End;
Procedure TSingleton.Free; Begin If Self <> Nil Then Destroy; End;
Initialization GlobalSingletonInstance := Nil Finalization GlobalSingletonInstance.Free; End. |
Anwender dieser Klasse können das Objekt beliebig erzeugen und freigeben, Es wird jedoch nur ein Objekt instantiiert und auch nur freigegeben, wenn keine weiteren Referenzen existieren.
_________________ Na denn, dann. Bis dann, denn.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Mo 20.10.08 10:49
In dem Artikel müsste man direkt noch die Delphi-Implementierung mit einfügen.
@ alzaimar: Danke für dieses wirklich gute Beispiel. Ich bin jetzt im Bilde  Eine kleine Frage am Rande noch: Class Function habe ich in Delphi noch nie gesehen. Aber ich denke mal, dass es das Pendant zu static final in Java ist, oder? Dann ist mir alles restlos klar 
_________________ In the beginning was the word.
And the word was content-type: text/plain.
Zuletzt bearbeitet von matze am Mo 20.10.08 12:01, insgesamt 2-mal bearbeitet
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 20.10.08 11:31
_________________ Na denn, dann. Bis dann, denn.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Mo 20.10.08 12:00
alzaimar hat folgendes geschrieben : | Aber ich denke mal, dass es das Pendant zu Class Function in Delphi ist, oder? |
Scherzkeks
Ich hab das mal nachgeschaut. Es ist so.
Damit wir auf dem gleichen Stand sind: Diese Funktion wird dann nicht im Objekt aufgerufen, sondern in der Klasse. Also gibt es quasi immer nur "eine Stelle" an der der Methodenaufruf "rauskommt". Nämlich in der Klasse und nicht in den einzelnen Objekten. Richtig?
Kann man denn in Delphi auch Datenfelder als class definieren?
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 20.10.08 12:18
matze hat folgendes geschrieben : | Kann man denn in Delphi auch Datenfelder als class definieren? |
Nein. Äh.. Doch.  (Nein: D6, Doch: BDS 2006)
_________________ Na denn, dann. Bis dann, denn.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 20.10.08 12:19
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 20.10.08 13:15
Man kann aber auch einfach den Konstuktor public lassen und die Methode NewInstance überschreiben. Hatte dazu auch mal irgendwo ein Beispiel zu gefunden ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|