Children destroyen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Children destroyen

Beitrag von Jan »

Moin,

Anfängerfrage, ich dreh mich da gerade im Kreis.

Wenn ich alle Children eines XbpParts löschen möchte kann ich ja eine Liste aller Children einlesen. Und diese eigentlich einzeln durchgehen und löschen. Aber irgend wo übersehe ich da etwas. Denn die Parts werden zwar gelöscht, aber die Handles und der Speicher werden lt. Memory Watcher nicht freigegeben.

Was ich da mache:

Code: Alles auswählen

aChildren := oParent:childList()
FOR i := 1 TO Len(aChildList)
    aChildList[i]:destroy()
    aChildList[i] := NIL
NEXT
Was übersehe ich da?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Children destroyen

Beitrag von Tom »

Dass es Enkelkinder geben kann?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Children destroyen

Beitrag von Jan »

Moin Tom,

nö, keine Enkel. Und selbst wenn - die wären sehr sicher ebenfalls LOCAL, und damit automatisch mit destroyed.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Re: Children destroyen

Beitrag von Tom »

Mmh. Ich bin da nicht so sicher.

Okay, aber dann die nächste Frage: Wenn Du sagst, dass der Zerstör- und Löschvorgang ordentlich läuft, aber der Memory Watcher weiter hohe Last signalisiert - hast Du dann mal gecheckt, ob das Löschen und Zerstören überhaupt Wirkung hatte? Ändert sich die ChildList()?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Children destroyen

Beitrag von Jan »

Hallo Tom,

ja. Wenn ich im Debugger nach dieser Schleife noch mal die Childlist dieses Parents einlese, dann sind die gewünschten Einträge tatsächlich weg. Und wenn ich dann in der XBParts-Liste des Memory Watchers den Refresh auslöse, wird diese Liste auch passend korrigiert. Nur die Handles und der Speicherbedarf bleiben wie vor der Löschung.

Und wegen der Enkel: Das sind alles nur einfache XbpStatic, in denen ich Position Größe, Schriftfarbe, und Caption setze. Sonst nichts. Also wirklich ganz simple Teile, ohne eigene Kinder.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Slavko
Rookie
Rookie
Beiträge: 11
Registriert: Mi, 20. Dez 2023 11:03
Wohnort: Negotin
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Children destroyen

Beitrag von Slavko »

Hi,

Die mögliche Ursache hierfür könnten Threads sein. Xbase++ ist multithreaded und großartig. Der Thread könnte durch die WinAPI-Funktionen ExitThread oder TerminateThread beendet werden. Ich weiß nicht, was Xbase++ verwendet. Wenn es ExitThread verwendet, ist es in Ordnung, aber wenn es TerminateThread verwendet, gibt es viele Probleme. Folgendes sagt die MS-Thread-Referenz:
ExitThread is the preferred method of exiting a thread. When this function is called, the current thread's stack is deallocated, all pending I/O initiated by the thread is canceled, and the thread terminates. The entry-point function of all attached DLLs is invoked with a value indicating that the thread is detaching from the DLL.
A thread in an executable that is linked to the static C run-time library (CRT) should use _beginthread and _endthread for thread management rather than CreateThread and ExitThread. Failure to do so results in small memory leaks when the thread calls ExitThread.
The TerminateThread and TerminateProcess functions should be used only in extreme circumstances, since they do not allow threads to clean up, do not notify attached DLLs, and do not free the initial stack, causing a memory leak.
Terminating a thread does not necessarily remove the thread object from the system. A thread object is deleted when the last thread handle is closed.
Wie Sie sehen, ist dies eine sehr heikle und wichtige Angelegenheit, und wenn jemand Details darüber hat, wie es in Xbase++ implementiert wird, wäre es schön, es mitzuteilen.

Slavko
Best regards,

Slavoljub Damnjanovic
SD-SoftDesign, Alaska Software Technology Partner
https://www.sd-softdesign.com
https://www.sd-softdesign.rs
Antworten