Seite 1 von 1

Children destroyen

Verfasst: Sa, 02. Dez 2023 20:45
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

Re: Children destroyen

Verfasst: So, 03. Dez 2023 10:38
von Tom
Dass es Enkelkinder geben kann?

Re: Children destroyen

Verfasst: Mo, 04. Dez 2023 5:14
von Jan
Moin Tom,

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

Jan

Re: Children destroyen

Verfasst: Mo, 04. Dez 2023 15:05
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()?

Re: Children destroyen

Verfasst: Mo, 04. Dez 2023 15:21
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

Re: Children destroyen

Verfasst: Do, 04. Apr 2024 9:29
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