Wie verwaltet Blitz DLLs ?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

ByteCroc

Betreff: Wie verwaltet Blitz DLLs ?

BeitragFr, Jul 20, 2007 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiß zufällig jemand wie Blitz3D das mit den DLLs intern so regelt.

Wenn ich nun zum Programmstart eine eigene DLL ausführen will, welche ich im späteren Programmverlauf nicht mehr benötige, entfernt Blitz die DLL wieder aus dem Speicher oder erst beim beenden des Programmes ?
Wenn nein könnte man ja eine DLL innerhalb einer DLL aufrufen und sie nach gebrauch frei geben.
Das macht natürlich nur Sinn wenn es nicht auf Speed ankommt, eben beim Programmstart oder nachladen eines Levels usw.

Abrexxes

BeitragFr, Jul 20, 2007 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Setze dich doch mal in eine Ecke, konzentriere dich auf einen Punkt tief im Universum und denke scharf darüber nach wozu eine DLL eigentlich "D"LL heist und nicht "B"LL oder "C"LL!

Dann bleiben solche blöden Fragen aus.

cu
 

ByteCroc

BeitragFr, Jul 20, 2007 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur weil du bescheid weißt ist es für dich eine dumme Frage.

http://de.wikipedia.org/wiki/Dynamic_Link_Library

Wenn ich das VC Beispiel von der Seite nehme, wird mit FreeLibray(LibHandle) die DLL aus dem Speicher ernfernt, wann machts das Blitz ?
Am Programende ? Nach jedem DLL-Funktionsaufruf ? (warscheinlich nicht) , wenn man nun eine Möglichkeit findet an das LibHandle zu gelangen und die DLL aus dem Speicher wirft, crasht da evtl. Blitz am Ende ?

Oder bin ich da irgendwie auf dem falschen Pfad, wenn ja dann führe mich mal jemand auf den Richtigen, bitte.
 

David

BeitragFr, Jul 20, 2007 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Implementierungsdetails wendest du dich am besten an Mark Sibly. Aber ich kann dir mit ziemlicher Sicherheit sagen das Blitz die Dlls nicht vor jeden Funktionsaufruf lädt und danach wieder killt, das wär ziemlich die dümmste Vorgehensweise die möglich ist.
http://bl4ckd0g.funpic.de

Abrexxes

BeitragFr, Jul 20, 2007 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitz macht überhaupt nichts. Wie eine dll sich verhält hängt davon ab wie sie programmiert wurde. Wenn das korrekt der Fall ist entläd Sie sich selbst wenn die letzte Instanz geschlossen wird. Ist das nicht der Fall wird sie vom OS beendet sobald sie letzte Instanz geschlossen wird. Bei bass.dll sind das zb initbass und freebass.

cu
 

ByteCroc

BeitragFr, Jul 20, 2007 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke erstmal.
Dann dürfte das entfernen aus dem Speicher jedenfalls keine Komplikationen verursachen.

Abrexxes

BeitragFr, Jul 20, 2007 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, wie gesagt, gute DLLs haben ein Commando dafür oder tun es automatisch. Bei BASS zb muss man es manuell machen, sonst müsstest du jedesmal wenn nichts spielt die dll neu anfragen da sie sich automatisch schliest, das wäre also bei einer Audiolib blöd. Very Happy
 

ByteCroc

BeitragFr, Jul 20, 2007 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie blick ich es gerade noch nicht so ganz

Mal 2 Beispiele wie ich mir das nun vorstelle:

1. Beispiel:

Ich initialisiere eine Klasse in einem Namespace, da ich sie in anderen Funktionen auch nochmal brauche, mitsammt den Inhalten, dann erstelle ich eine Instanz am Anfang des Programmes mit einer Init Funktion

nun kann ich auf die Klasse innerhalb anderer Funktionen zugreifen wenn ich den Namespace nutze.

Dann wird sie wohl erst wieder entfernt wenn ich den Destruktor aufrufe, denn dann ist die eine und letzte Instanz geschlossen.
DLL wird aus dem Speicher genommen.

2. Beispiel
ich benutze Globale Variablen oder static Var. innerhalb Funktionen, diese erhalten den Wert wenn ich die Funktion ein weiteres mal aufrufe, Globale sowieso, ich kann mit allen Funktionen drauf zugreifen (oder eben Variablen in Namespaces)
Hier kann Blitz oder die DLL selbst ja nie wissen wann sie nochmal gebraucht wird.
Man müsste sie also schliesen.

Also mein Fazit wäre, wenn sich eine DLL selbst schliesen soll und ich nur eine Funktion einmal brauche, dann erstelle ich zu beginn der Funktion eine Instanz der Klasse nach beenden der Funktion schliest sich die DLL von selbst.

Bitte berichtigen wenn ich mich jetzt total im Sumpf verirrt habe.

Abrexxes

BeitragFr, Jul 20, 2007 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.spieleprogrammierer...mp;start=0

Du gucken da und melden an für fetteste Fragen. Smile
 

ChristianK

BeitragFr, Jul 20, 2007 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die DLL wird von Blitz bei Beginn des Programms geladen und am Ende wieder entladen. Du kannst das auch überprüfen, indem du in der DllMain die Messages DLL_PROCESS_ATTACH bzw. DLL_PROCESS_DETACH verarbeitest und dann z.B. eine MessageBox anzeigen lässt.

Was die DLL intern macht ( also mit Namespace und Klassen etc. ) ist eigentlich egal. Der Reference Count für die DLL wird verringert, wenn FreeLibrary aufgerufen wird. Wenn er bei 0 ist, wird sie aus dem Speicher entfernt.

Edit: Oh, zu spät ...
 

ByteCroc

BeitragFr, Jul 20, 2007 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für die Antworten und den Link, sowie ich das nun sehe
werde ich so vorgehen, da ich eh das gesammte Programm ausser den grafischen Elementen 3D+2D in einer DLL ausführen will lade ich die DLL's welche ich nur zu Anfang brauche und Speicherfressend sind innerhalb der HauptDLL zur Laufzeit, wie auf der Wikiseite mit LoadLibray() und entferne sie mit FreeLibray(), dann hat sie mit Blitz direkt schonmal nichts zu tun und Fragen welche daraus für mich noch aufkommen stell ich in einem C++ Forum, da es mit Blitz eigentlich nichts zu tun hat.
Nochmals Danke für eure Bemühungen.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group