Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 23:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [Delphi] AfterConstruction
BeitragVerfasst: Di Mai 08, 2007 08:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo,
ich musste in mein Projekt die Methode AfterConstruction einbauen, denn ich brauche die Möglichkeit, ein Objekt noch während des Konstruktors (bzw. sofort danach) wieder freizugeben. Nun lese ich, dass es diese Methode in Delphi8 nicht mehr gibt: http://www.dsdt.info/insider/sprache/interna/konstruktor.php (ganz unten). Damit geht mir meine Vorwärtskompatibilität verloren.

Hängt das mit NET zusammen? Und wenn ja, wie würde man das Problem in Net lösen?
Danke im Voraus für Eure Antworten
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 08, 2007 11:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Bei .Net muss man keine Objekte mehr freigeben. Das geschieht automatisch. Ansonsten ist es auch keine gute Sache im Konstruktor den Speicher selber wieder freizugeben. Man sollte eine Exception auslösen, weil bei einer Exception im Konstruktor sofort der Destruktor aufgerufen wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 08, 2007 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Es ist aber möglich, dass erst anläßlich des Konstruktors klar wird, dass das Objekt, das soeben erzeugt wird, nicht gebraucht wird. Zum Beispiel:

Das Programm fordert eine Textur an mit
Code:
  1. TXYZTexture.Create('Drachenkopf', AOwner);

AOwner(= das Texturen-Verwaltungsobjekt) entdeckt, dass die Textur "Drachenkopf" bereits geladen ist. Ein zweiter solcher wäre bloße Speicherplatzverschwendung, daher duldet AOwner keine Doubletten und verweigert die Registrierung. Das TXYZTexture kann sich selbst fragen, ob es registriert wurde (denn diese Info kriegt es), und wenn nicht, kann es sich selbst freigeben, und zwar im AfterConstruction, schnell und schmerzlos.

Natürlich wäre auch möglich, dass vor dem Erzeugen der Textur angefragt wird, ob es eine solche Textur schon gibt, aber angenommen, das wird einmal vergessen? Dann habe ich ein freischwimmendes nutzloses Objekt, das sowohl Speicherplatz in der CPU als auch in der GPU verbraucht.

Dh. ich müsste für NET auf eine Exception im Konstruktor umsteigen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 08, 2007 15:42 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Nein, das mit der Exception bezog sich noch auf das normale Delphi. Bei .Net gibt es keinen Destruktor im eigentlichen Sinne. Es gibt einmal die Möglichkeit IDisposable mit der Methode Dispose zu implementieren, falls Ressourcen explizit durch den Programmierer freigegeben werden müssen. Dann muss man Dispose aufrufen, so wie man jetzt Free aufruft. Bei Delphi.Net ruft .Free auch Dispose auf. Die zweite Möglichkeit ist Finalize zu überschreiben. Diese Methode wird vom System ausgeführt, wenn es keine Referenzen mehr auf das Objekt gibt. Kombinationen aus beiden Varianten sind auch möglich.

Wie weit das mit dem Problem zu tun hat, weiß ich nicht. Falls das Objekt sonst keine externen Resourcen belegt, braucht man gar nichts zu tun. Wenn es nicht mehr referenziert wird und das ist der Fall, wenn man es keiner lokalen Variable zuweist, wird es automatisch entfernt. Ansonsten wäre noch zu überlegen, ob das die richtige Strategie ist. Es wäre eventuell leichter, die Texture beim Verwaltungsobjekt anzufordern und gar nicht erst erstellen zu lassen. Wenn sich das Verwaltungsobjekt auch um die Erstellung kümmert, wäre das mit dem Vergessen eigentlich auch kein Problem.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 08, 2007 20:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Es wäre eventuell leichter, die Texture beim Verwaltungsobjekt anzufordern und gar nicht erst erstellen zu lassen. Wenn sich das Verwaltungsobjekt auch um die Erstellung kümmert, wäre das mit dem Vergessen eigentlich auch kein Problem.

Naja, manchmal hab ich software-technisch bestimmte Vorgaben zu beachten und habe daher nicht immer die freie Wahl. Manchmal bin ich aber auch ganz einfach vernagelt. :wink:
Danke jedenfalls.
Traude.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 09, 2007 17:18 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Also ich weiß net, ob .NET das frisst, aber im normalen Delphi gibts auch initinstance, was sich aussuchen kann, was den speicherbereichfestlegt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 09, 2007 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
aus der Delphi-Hilfe:
Zitat:
Die Methode InitInstance setzt alle Speicherzellen in dem für ein neues Objekt reservierten Bereich auf Null und initialisiert den Zeiger auf die Tabelle der virtuellen Methoden der Instanz.

Und was soll ich damit machen? Den Zeiger für die VMT manipulieren? Lieber nicht. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 09, 2007 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine Alternative wäre den Konstruktor privat zu machen und dafür eine Klassenmethode Create zu verwenden, die eine neue Instanz erstellt.

Code:
  1. class function TTexture.Create(const filename:string):TTexture;
  2. begin
  3. ...
  4. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 10, 2007 09:37 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Klingt gut. Das werde ich mal ausprobieren.
Dankeschön.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 10, 2007 17:14 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Wo ist da der Vorteil gegenüber Newinstance?
Code:
  1. class function TObject.NewInstance: TObject;virtual;
  2. begin
  3.   Result := InitInstance(_GetMem(InstanceSize));
  4. end;
  5.  

Einfach die virtuelle methode überschreiben, du kannst jeder beliebige TObject zurückgeben (auch nil nehme ich an). Wäre auch zum implementieren eines singleton ganz interessant. kA obs .NET kompatibel ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 10, 2007 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Nein, das gibt es nicht in .Net und darum ging es ja.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]