Seite 1 von 3

[gelöst] Hab ich alles gelöscht ?

Verfasst: 14.03.2008 17:39
von scholly
moin, moin...

Mir fällt kein besserer Betreff ein :oops:

Gibt es eine PB-interne Möglichkeit, mit der man herausfinden kann, ob man am Ende eines Codes (Programm, Procedure, Gosub-Routine) noch irgendwas übrig hat, das man vorher z.B. mit Createxxx, Openxxx, Loadxxx o.Ä. initiert hat und eigentlich mit Freexxx, Closexxx o.Ä. entfernen sollte?

Mir ist klar, daß übersichtlicher Code und eigene Sorgfalt helfen, aber es könnte ja sein, daß PB sich sowas mitschreibt und anzeigen kann, was da noch "offen" ist.

mDv...

Verfasst: 14.03.2008 17:50
von AND51
Alle Ressourcen werden bei Programmende automatisch freigegeben.
Rein theoretisch könntest du also auf jeden FreeXXX, CloseXXX und FinishXXX Befehl verzichten.

Natürlich sollte man das nicht machen, sondern immer schön alles manuell wieder freigeben. Aber wie gesagt, alles, was noch übrig ist, wird beim End automatisch entfernt.

Lies dir einfach mal die Hilfe besser durch!!!
Dann siehst du auch von allein öfter Sätze wie
AllocateMemory() hat geschrieben:Hinweis: Alle reservierten Speicherbereiche werden automatisch freigegeben, wenn das Programm beendet wird.
CreatePack() hat geschrieben:Sobald alle Schreiboperationen abgeschlossen wurden, sollte ClosePack() aufgerufen werden. Hinweis: PureBasic schließt am Programmende automatisch alle noch offenen Pack-Dateien.
CloseFile() hat geschrieben:Hinweis: Am Programmende ist PureBasic "klug" genug, zur Sicherheit alle offenen Dateien automatisch zu schließen, sofern Sie den gesonderten Aufruf von CloseFile() vergessen haben.
AddSystrayIcon() hat geschrieben:Hinweis: Alle SysTray Icons werden automatisch am Programmende entfernt.

Verfasst: 14.03.2008 18:01
von scholly
Schön, daß Du den Themenbereich "Programmende" so ausführlich beleuchtet hast.

Was ist in den Restbereichen (Proceduren, Gosub-Routinen)?

Verfasst: 14.03.2008 18:04
von bobobo
Gosubs und Proceduren werden vom Programm aufgerufen und demnach
auch initialisiert und beim Beenden (spätestens mit End) freigegeben.

Nur Threads könnten unter Umständen Probleme bereiten.

Verfasst: 14.03.2008 18:06
von scholly
@bobobo:
Hast Du meine Frage im ersten Posting wirklich gelesen ???? :freak:

Re: Hab ich alles gelöscht ?

Verfasst: 14.03.2008 18:09
von bobobo
scholly hat geschrieben:moin, moin...

Mir fällt kein besserer Betreff ein :oops:

Gibt es eine PB-interne Möglichkeit, mit der man herausfinden kann, ob man am Ende eines Codes (Programm, Procedure, Gosub-Routine) noch irgendwas übrig hat, das man vorher z.B. mit Createxxx, Openxxx, Loadxxx o.Ä. initiert hat und eigentlich mit Freexxx, Closexxx o.Ä. entfernen sollte?

Mir ist klar, daß übersichtlicher Code und eigene Sorgfalt helfen, aber es könnte ja sein, daß PB sich sowas mitschreibt und anzeigen kann, was da noch "offen" ist.

mDv...
diese ? denk schon.
und dann ne Antwort auf Dein 2.Posting gegeben

Verfasst: 14.03.2008 18:12
von scholly
Hast Du sie auch Verstanden ?
ob man am Ende eines Codes (Programm, Procedure, Gosub-Routine) noch irgendwas übrig hat, das man vorher z.B. mit Createxxx, Openxxx, Loadxxx o.Ä. initiert hat und eigentlich mit Freexxx, Closexxx o.Ä. entfernen sollte?

Verfasst: 14.03.2008 18:15
von AND51
Egal, wobei es sich handelt. Öffnest du etwas, z. B. Dateien, dann solltest du sie ein paar zeilen später auch wieder schließen.
Sowas darf man als "ordentlicher" Programmierer nicht vergessen. Und wenn doch ist wie gesagt, nicht schlimm. Bei Programmende wird alles automatisch freigegeben.

Auch innerhalb einer Prozedur wirst du wahrscheinlich Dateien und Bilder manuell mit LoadImage() und OpenFile() laden. Wo ist denn da das Problem, diese Dateien auch wieder zu schließen?

Es gibt höchstens dann ein Problem, wenn du dynamisch Dateien laden möchtest, z. B. alle Bilder eines Ordners.
Poblem kann man das aber nicht nennen. Denn wenn du wieder ein "ordentlicher", also disziplinierter Coder bist, dann wirst du die dynamisch geöffneten Datei nauch wieder dynamisch schließen. Speichere einfach alle FileIDs, ImageIDs und sonstwas in einer LinkedList und gut ist.

Beispiel:

Code: Alles auswählen

Procedure AufUndZu()
	; In dieser LinkedList speichern wir gleich alle IDs
	Protected NewList dateien.l()
	
	; Jetzt öffnen wir dynamisch alle Dateien in diesem Ordner
	; Wichtig: Wir wissen vorher nicht, wie viele Dateien es sind
	If ExamineDirectory(0, "C:\WINDOWS\", "")
		While NextDirectoryEntry(0)
			If DirectoryEntryType(0) = #PB_DirectoryEntry_File
				; Datei jetzt öffnen und das Handle gleich mit abspeichern
				AddElement(dateien())
				dateien()=ReadFile(#PB_Any, "C:\WINDOWS\"+DirectoryEntryName(0)) ; Wichtig: #PB_Any benutzen, damit die IDs dynamisch sind!
			EndIf
		Wend
		; Auf FinishDirectory() verzichten wir, wird gleich automatisch gemacht =)
	EndIf
	
	; Alle IDs einmal anzeigen lassen
	ForEach dateien()
		Debug dateien()
	Next
	
	; Jetzt alle Dateien wieder dynamisch schließen
	ForEach dateien()
		If IsFile(dateien()) ; Wichtig, denn vllt. konnte eine Datei ja nicht geöffnet werden, dann ist seine ID gleich null
			CloseFile(dateien())
		EndIf
	Next
EndProcedure

AufUndZu()
End

Verfasst: 14.03.2008 18:27
von scholly
Ich machs mal kurz:

Ich will keine Lehrstunde in Programmieren, ich will nur wissen, ob es irgendeine Einstellung in der PB-IDE gibt, die neben/anstatt der "Templates" oder in einem eigenen Fenster anzeigt, was noch "geöffnet" ist.

Darauf gibt es nur 2 Antworten:

1. Nein
2. Ja, stell in den IDE-Einstellungen das... oder das... ein.

Mit einer von diesen beiden Möglichkeiten bin ich zufrieden.
Welche trifft zu ?

Danke.

Verfasst: 14.03.2008 18:27
von AND51
bobobo hat geschrieben:Gosubs und Proceduren werden vom Programm aufgerufen und demnach
auch initialisiert und beim Beenden (spätestens mit End) freigegeben.

Nur Threads könnten unter Umständen Probleme bereiten.
Naja, naja...

Gosubs sind nichts anderes als Umleitungen. Die Programmausführung wird an einer anderen Stelle/Zeile im Programm forgesetzt und dann geht's wieder zurück. Da gibt's nichts zu de-initialiseren.
Prozeduren werden beim Verlassen automatisch deinitialisiert, Variablen werden z. B. entweder gelöscht und bei erneutem Prozeduraufruf neu definiert. Deswegen sollte man ja auch Protected benutzen. Ich finds immer wieder sch... äh... schön verwunderlich, wenn die Coder hier in ihren Prozeduren starre IDs vergeben und nicht EnableExplicit-konform arbeiten. Ts, ts, ts...

Threads werden, wenn sie sich beenden auch automatisch freigegeben. Ausnahme: Der Thread wird mit KillThread() beendet. Wie auch in der Hilfe steht, hat der Thread in diesem Fall keine Chance, sich selbst zu beenden. Initialisertes Zeug bleibt also im Speicher. Daher sollte man Threads lieber per Flags oder per ProcedureReturn beenden.


@ scholly:
Was willst du bei Bedarf denn noch freigeben? Ressourcen wie Dateien, Bilde,r etc. oder Prozeduren und Gosubs? Letzteres kannst du nicht freigeben, siehe oben.

Wie gesagt, ordentliche Programmeirer vergessen keine FreeXXX Befehle. Übrigens kann man zum freigeben und gleichzeitig neu belegen einer ID auch folgendes tun:

Code: Alles auswählen

CreateFile(1, "C:\test.txt") ; Erstellen einer Datei mit der ID 1
     WrtieString(1, "Hallo Welt") ; was reinschreiben
ReadFile(1, "C:\test.txt") ; Da ReadFile die gleiche ID wie CreateFile hat, wird CreateFile AUTOMATISCH geschlossen und freigegeben
     Debug ReadString(1)

; Auf CloseFile verzichten, wird an dieser Stelle autom. erledigt
Das Verfahren, wie man eine Ressource schließt/freigibt und gleichzeitg eine neue Ressource erstellt/öffnet/läd, wird auch so in der HIlfe beschrieben. Ich habe es hier anhand von Dateien demonstriert. Das gleiche Verfahren funktioniert aber auch mit Bildern, Sprites, Texturen, usw...