Class Destroy() ? [erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Class Destroy() ? [erledigt]

Beitrag von AUGE_OHR »

hi,

wenn ich XbParts habe und die auf der oDlg:DrawingArea plaziere dann werden die bei einem oDlg:Destroy() auch alle "sauber" entsorgt.

wenn ich aber noch mehr Objecte habe, die keine o:DrawingArea benötigen, wie bekomme ich die weg ?
klar könnte ich solche in ein Array aufnehmen ...

oder denke ich da jetzt falsch ... meisten hab ich ja eine Variabel := Class und wenn die lokal ist ...
es gibt ja eine o:initClass() ... aber keine o:exitClass() und eine Method o:Destroy() ist ja keine Pflicht.

Frage : muss ich bei einer eigenen Class, die nicht FROM XbPart ist, selbst "aufräumen" oder macht das der CG für mich ?
Zuletzt geändert von AUGE_OHR am Mi, 01. Okt 2014 9:41, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Tom »

Hallo, Jimmy.

Objekte sind ganz "normale" Variablen. Sind sie LOCAL, werden sie gelöscht, wenn sich die entsprechende Funktion beendet. Sind sie PRIVATE, macht das der GC. Destroy() löscht ja bei entsprechenden Objekten - die i.d.R. XbParts sind oder zumindest von ihnen abgeleitet - nicht das Objekt selbst, sondern gibt nur die Systemressourcen frei. Bei Objekten, die nicht in diesem Kontext verwendet werden, ist das überflüssig. XbParts können aber nach meinem Dafürhalten tatsächlich nur gelöscht werden, wenn zuvor ein Destroy() erfolgt ist.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Class Destroy() ?

Beitrag von Manfred »

Hi Tom,

ich meine, dass Thema hatten wir schonmal. Bei LOCAL Variablen wäre ich vorsichtig mit der Behauptung, sie werden gelöscht, wenn die Funktion verlassen wird. Ich habe Funktionen, die oft hintereinander aufgerufen werden und LOCALe Var und Objekte enthalten. Es gab dabei starke Probleme, die erst dann behoben wurden, als ich jede LOCAL vor dem Beenden der Funktion mit NIL versehen hatte.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Tom »

Hallo, Manfred.

Das lag aber dann mit ziemlicher Sicherheit an Dir. Objekte können ja sehr komplex werden und beispielsweise Referenzen auf Variable enthalten, zum Beispiel Arrays, was dann Pointer wären. In dieser Situation kann die (automatische) Löschung tatsächlich scheitern.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Class Destroy() ?

Beitrag von Manfred »

OK,

bevor wir jetzt ins Endlose kommen: Ich meinte, dass der GC nicht sofort den Speicher säubert und deshalb die Funktion beendet werden mußte, indem die LOCAls vorher genillt wurden. Danach hat der GC prima gearbeitet. Ich finde aber leider den Thread dazu nicht mehr. Oder doch? http://www.xbaseforum.de/viewtopic.php? ... it=garbage
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von brandelh »

Hallo Manfred,

die Antwort ist einfach ...
der GC killt eine LOCALE Variable, nachdem KEINE REFERENZ mehr auf diese besteht und er Zeit hat !
Wenn du also eine lokale Variable zurückgibst oder in einem CodeBlock verwendest, kann zwar die Funktion schon beendet sein,
deine Variable ist aber weiter in Verwendung. Da darf der GC diese auch nicht löschen.

Der Fall wo eine NIL Zuweisung sinnvoll ist, ist sehr begrenzt.
Angenommen du hast 300 MB Daten in einer String oder 10.000 Elemente in einem Array ... und das Programm ist anderweitig beschäftigt.
Der GC wird IRGENDWANN den Speicher bereinigen, wenn man aber solch großen Speicherbereiche nach der letzten Verwendung auf NIL setzt, weiß der GC sofort - viel unnötiger Speicher, den muss ich freigeben ... so zumindest habe ich es im Gedächtnis.

PS: es kostet nix die VAR auf NIL zu setzen, eventuell ist es nur überflüssig ;-)
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Tom »

Woher kommt eigentlich diese Sicherheit, dass der GC irgendwas mit LOCALs am Hut hat?

@Manfred: Im von Dir verlinkten Thread gibt es ein Beispiel. In diesem Beispiel retourniert die Funktion einen Codeblock, der die lokalen Variablen enthält. Das nennt man "detached locals" (nur Martin verwendet diese Bezeichnung für eine andere Situation :wink: ). Diese Variablen müssen überleben.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Class Destroy() ?

Beitrag von Manfred »

vielleicht habe ich jetzt auch den falschen Thread in der Eile gewählt. Bei meinem Problem ging es um normale "Variablen"
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von brandelh »

Tom hat geschrieben:Woher kommt eigentlich diese Sicherheit, dass der GC irgendwas mit LOCALs am Hut hat?
meinst du jetzt MICH ?

Ab und zu verstehe ich deine Frage nicht :wink:

Wer sonst sollte ungenutzten Speicher aufräumen ?
Da keiner von uns den Quellcode hat, können wir nur vom Hörensagen leben und dort wurde ab und an erwähnt,
das der GC unbenutzte Speicherbereiche freigibt. Auch LOCALs werden nicht automatisch freigegeben, obwohl LONG eventuell schon.
Stringspeicher keinesfalls.
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Herbert »

Hubert, was schreibst denn du :?:
Wer wann welchen Speicher räumt ist doch völlig egal.

Sobald dein Objekt oder Funktion baden geht, tauchen auch die lokalen Variablen mit - unter der von Tom erwähnten Ausnahmen. Komplett wurst, ob NIL drin steht oder nicht.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von brandelh »

Sorry Herbert,

aber ... nein ich bleibe freundlich. :wink:

wenn du oben liest was ich geschrieben habe, siehst du dass ich von großen Speicherbereichen gesprochen habe,
die einfach schneller freigegeben werden wenn man die sofort auf NIL setzt, ich habe nicht geschrieben dass das (immer) nötig ist.
Aber ich habe durchaus 300 MB Strings im Speicher und unter Win32 kann es da eng werden, weil freier Speicher in Blöcken angesprochen wird.

Es mag sein, dass der GC zwischenzeitlich soviel besser wurde, dass die Info überholt ist, aber was einmal funktionierte merke ich mir halt.
Auf jeden Fall ist es NICHT FALSCH komplexe Variablen auf NIL zu setzen wenn man sie nicht mehr braucht.

Ich frage mich aber ernsthaft warum in letzter Zeit einige jedes meine Worte auf die Goldwaage legen ... :roll:
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Herbert »

Hubert, ich lege nichts auf die Goldwaage.
Nimm diese Dinge bitte nicht persönlich.
Ich frage einfach.
und
verstehe weiterhin nicht, wieweit Speichergrenzen durch Setzen auf NIL weiter werden sollen. Was ist denn in diesen 300MB-Dingern?

Da hilft nur noch in 64-bit zu programmieren...echt.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Herbert »

brandelh hat geschrieben: Es mag sein, dass der GC zwischenzeitlich soviel besser wurde, dass die Info überholt ist, aber was einmal funktionierte merke ich mir halt.
Auf jeden Fall ist es NICHT FALSCH komplexe Variablen auf NIL zu setzen wenn man sie nicht mehr braucht.
Verboten ist dies nicht. Macht aber erst Sinn, wenn deren Inhalt echt gross ist.
Aber es ging ja um die Frage, was mit den Dingen passiert, wenn das Objekt zerstört wurde. Dann sind die lokalen Variablen nämlich weg man und braucht keinesfalls mehr auf nill setzen :angel3: .
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Class Destroy() ?

Beitrag von AUGE_OHR »

hi,

Danke für eure Antworten aber es geht nicht in die Richtung die ich meine.

Bei XbParts sind wir damit "verwöhnt" das der CG für uns einiges "aufräumt" aber eben nicht alles.

Code: Alles auswählen

Local a := XbpActiveXControl()
hier wäre es ja nicht "nur" die Variabel "a" sondern es besteht ja auch eine "Verbindung" ( die Speicher angefordert hat )
auch bei den native Controls oder den native SQL Schnittstellen muss ich mich "manuell" um das "aufräumen" kümmern.

da es nun eine InitClass() gibt frage ich nach einer ExitClass() ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von brandelh »

Herbert hat geschrieben:Hubert, was schreibst denn du :?:
Wer wann welchen Speicher räumt ist doch völlig egal.
Sobald dein Objekt oder Funktion baden geht, tauchen auch die lokalen Variablen mit - unter der von Tom erwähnten Ausnahmen. Komplett wurst, ob NIL drin steht oder nicht.
OK, vielleicht war ich zu "empfindlich" beim Lesen ...

Die Sache ist die, wie genau der GC arbeitet und ob die Überlegungen zwischenzeitlich unnötig sind, weiß ich auch nicht.
Richtig ist, dass ein String mit 300 MB z.B. der bearbeitet wird, also z.B. per Value an an eine Funktion übergeben wird,
mindestens einen ebensogroßen freien Speicherblock benötigt. Unter einem 32 Bit Windows teilt sich ja alles den physikalischen Speicher und wenn der nicht reicht wird auf Platte ausgelagert. Somit tritt hier das Problem früher auf als unter Win 64 bit.

Der GC macht einen super Job, denn z.B. C Entwickler müssen sich da selbst drum kümmern.

Dennoch kann man ihm die Arbeit erleichtern, wenn man nicht auf die automatische Ausführung vertraut, sondern die unnötige Stringvariable mit den vielen MB (bei einigen MB ist das alles unnötig) per NIL Zuweisung sofort freigibt.
Herbert hat geschrieben:Hubert, was schreibst denn du :?:
Wer wann welchen Speicher räumt ist doch völlig egal.
lese ich so, dass ich keine Ahnung habe von was ich schreibe, aber ich verarbeitet tatsächlich Textdateien mit 500 MB und teilweise auch 300 MB mit memoread(), allerdings habe ich mittlerweile gemerkt dass die Verarbeitung mit meiner Klasse die immer 4 KB Blöcke einliest viel sicherer und auch schneller ist ...

Zurück zur eigentlichen Frage ... wenn man keine Systemresourcen anfordert (Fonts, Drucker, Controls etc.) und auch keine Dateien öffnet), braucht man auch kein destroy(), grundsätzlich geht alles automatisch.
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von Herbert »

brandelh hat geschrieben:Unter einem 32 Bit Windows teilt sich ja alles den physikalischen Speicher und wenn der nicht reicht wird auf Platte ausgelagert. Somit tritt hier das Problem früher auf als unter Win 64 bit.
Unter 64bit hast du eine andere Verwaltung.
brandelh hat geschrieben:lese ich so, dass ich keine Ahnung habe von was ich schreibe, aber ich verarbeitet tatsächlich Textdateien mit 500 MB und teilweise auch 300 MB mit memoread(), allerdings habe ich mittlerweile gemerkt dass die Verarbeitung mit meiner Klasse die immer 4 KB Blöcke einliest viel sicherer und auch schneller ist ...
Liest sich fast so, ja. Aber ich kenne ja deine Fähigkeiten :idea: und mit den unglaublichen Grössen erreichst du spezielle Grenzen. Trotzdem, eine Textdatei in dieser Grösse muss es zuerst mal geben. Ich denke, da erstellt jemand sehr unwirtschaftlich sehr grosse Dateien.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Class Destroy() ?

Beitrag von Manfred »

Hi Herbert, da muß ich Dich bitter enttäuschen. Ich muß Textdateien einlesen, die über 1GB Größe haben. Tendenz noch größer.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Class Destroy() ?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Zurück zur eigentlichen Frage ... wenn man keine Systemresourcen anfordert (Fonts, Drucker, Controls etc.) und auch keine Dateien öffnet), braucht man auch kein destroy(), grundsätzlich geht alles automatisch.
Gegenfrage ... wann werden keine Systemresourcen anfordert ;)

Es ging mir um das Problem wenn ein entsprechendes o:Destroy() von meiner Class nicht vom User benutzt wurde das es dann Probleme machen könnte.

ich habe das Problem Problem jetzt damit gelöst das ich FROM THREAD dazu genommen haben und somit über die Methoden
:atEnd( [<xParamList,...>] ) --> NIL
:atStart( [<xParamList,...>] ) --> NIL
verfüge die ich zum sauber "aufräumen" benötige.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Class Destroy() ?

Beitrag von brandelh »

Herbert hat geschrieben:
brandelh hat geschrieben:Unter einem 32 Bit Windows teilt sich ja alles den physikalischen Speicher und wenn der nicht reicht wird auf Platte ausgelagert. Somit tritt hier das Problem früher auf als unter Win 64 bit.
Unter 64bit hast du eine andere Verwaltung.
Ich meinte natürlich die Win32 EXE in einem Win64 Betriebssystem.
Herbert hat geschrieben: und mit den unglaublichen Grössen erreichst du spezielle Grenzen.
Trotzdem, eine Textdatei in dieser Grösse muss es zuerst mal geben.
Ich denke, da erstellt jemand sehr unwirtschaftlich sehr grosse Dateien.
Solche Dateien bekommt man meist von Großrechnern, bei uns im Datenaustausch von verschiedenen Systemen die mir Daten liefern und ja, ich komme an DBF 2 GB Grenzen ;-)

Bei der Lieferung sind einige dabei, die unnötigerweise fixe Satzlänge eingestellt haben,
aber andere haben tatsächlich 300 MB Dateien ohne feste Satzlänge.

Die größte Datei (CSV) erhielt ich von meiner Frau, die verzweifelt versucht hat in Excel 2010 einzulesen ...
über 2 Millionen Datensätze die sie kontrollieren sollte :shock:
Die "Dienstleister" die die erstellt haben, hatten kein Problem mit den Zeilen, aber Excel kann nur bis etwas über 1 Million.

Mit meiner TextReader Klasse habe ich die Datei eingelesen und auf die nötigen Felder reduziert in 4 CSV Dateien umgeladen.
Eigentlich wollte ich ja direkt eine Excel Datei mit 4 Arbeitsblättern erstellen, aber nach etwa 600.000 Zeilen ging dann auch die LibXL.DLL in die Knie.
Per Hand konnte ich mit Excel die 4 CSVs auf 4 Arbeitsblättern einlesen und zur Verfügung stellen. ;-)
Diese Dateien sind der Grund warum ich mich so intensiv mit Stringhandling und Optimierung beschäftigt habe.

Aber du hast schon Recht, kein "gewöhnliches" Problem :D
Gruß
Hubert
Antworten