LabVIEWForum.de
Speicher wird erst geleert nach schließen des Programms - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Speicher wird erst geleert nach schließen des Programms (/Thread-Speicher-wird-erst-geleert-nach-schliessen-des-Programms)

Seiten: 1 2


RE: Speicher wird erst geleert nach schließen des Programms - raverel - 08.07.2013 08:56

So,
ich habe nun mal folgendes gemacht.
http://digital.ni.com/public.nsf/allkb/77594203D78D12278625729100758BE5
Nur wenn ich meinem CLF-Node einen leeren Pfad übergebe, stehen immernoch wie gewohnt
die Daten des "nicht" angeschlossenen Slaves in meinem Cluster, obwohl ich doch grundsätzlich die .dll
nicht öffne. Oder versteh ich da irgendwas falsch?


RE: Speicher wird erst geleert nach schließen des Programms - jg - 08.07.2013 21:59

Was gibt dir eigentlich der Rückgabewert "CIFX_NO_ERROR" aus, wenn du keinen Teilnehmer im Netzwerk hast? Vielleicht einen Error, der darauf hinweist, dass du GetPacket gar nicht mehr durchführen sollst/darfst?

Gruß, Jens


RE: Speicher wird erst geleert nach schließen des Programms - raverel - 09.07.2013 07:38

Da bekomme ich die Meldung "No Error" zurück. Mir ist noch etwas aufgefallen. Ziehe ich das EtherNet Kabel, warte dann ca. 10 Minuten und führe dann den Suchlauf durch, wird mir die Anzahl der Slaves als null angezeigt.


RE: Speicher wird erst geleert nach schließen des Programms - GerdW - 09.07.2013 07:41

Hallo raverel,

Zitat:Ziehe ich das EtherNet Kabel, warte dann ca. 10 Minuten und führe dann den Suchlauf durch, wird mir die Anzahl der Slaves als null angezeigt.
Das hört sich nach einem TimeOut-Verhalten an...


RE: Speicher wird erst geleert nach schließen des Programms - raverel - 09.07.2013 08:06

Hm wohl wahr....aber wenn ich mir das mal überlege, kann es doch an der .dll nicht liegen oder? Weil wie ich schon beschrieben habe, einen leeren Pfad an meine .dll übergebe und dann den Suchlauf starte, sollte mir doch eigenltlich keine Werte mehr ins Cluster geschrieben werden. Das Cluster initialisiere ich anfangs immer auf den default Wert mit nullen.


RE: Speicher wird erst geleert nach schließen des Programms - rolfk - 09.07.2013 09:10

(08.07.2013 08:56 )raverel schrieb:  So,
ich habe nun mal folgendes gemacht.
http://digital.ni.com/public.nsf/allkb/77594203D78D12278625729100758BE5
Nur wenn ich meinem CLF-Node einen leeren Pfad übergebe, stehen immernoch wie gewohnt
die Daten des "nicht" angeschlossenen Slaves in meinem Cluster, obwohl ich doch grundsätzlich die .dll
nicht öffne. Oder versteh ich da irgendwas falsch?

Solange in Deinem Programm IRGENDEINE CLN ist die Deine DLL noch im Speicher behält, bleibt die ganz einfach im Speicher! Da hilft ein leerer Pfad an einer einzigen CLN gar nichts.


RE: Speicher wird erst geleert nach schließen des Programms - macmarvin - 09.07.2013 11:21

Mit dem Process Explorer kannst du per View->Lower Pane View->DLLs (Ctrl+D) schauen, ob eine DLL geladen ist oder nicht.
D.h. damit kannst du den Geladen/Entladen Zustand mit verfolgen.


RE: Speicher wird erst geleert nach schließen des Programms - raverel - 10.07.2013 16:29

Bedeutet das jetzt, dass ich an allen Stellen wo ich die .dll aufrufe einen leeren Pfad anhängen muss?
Ich habe nämlich im Moment keine Ahnung mehr was ich machen soll.


RE: Speicher wird erst geleert nach schließen des Programms - rolfk - 10.07.2013 19:33

(10.07.2013 16:29 )raverel schrieb:  Bedeutet das jetzt, dass ich an allen Stellen wo ich die .dll aufrufe einen leeren Pfad anhängen muss?
Ich habe nämlich im Moment keine Ahnung mehr was ich machen soll.

Wenn Du die DLL effektive aus dem Speicher werfen willst, Ja! Solange eine CLN (oder ein Aufruf vom Windows API LoadLibrary()) eine DLL im Speicher hält bleibt die ganz einfach dort. Da kannst Du einer einzelnen CLN 100 mal einen leeren Pfad geben, das ändert nichts. Und nein versuche nicht durch mehrmaligen Aufruf von FreeLibrary() die DLL doch noch aus dem Speicher zu werfen. Die CLN die eine DLL geladen hat geht davon aus dass das so bleibt bis Du einen leeren Pfad an die CLN gibst. Wenn Du die DLL dann hinter dem Rücken der CLN aus dem Specicher wirfst wird es garantiert knallen beim nächsten Aufruf einer solchen CLN da sie einfach davon ausgeht dass die DLL noch genau so im Speicher ist als zuvor, und bei inzwischen ausgeladener DLL ganz einfach ins Leere läuft.