Wie wichtig ist _BASS_Free() ?

  • Nabend zusammen,

    ich habe folgende Frage: Wie wichtig ist es am Ende eines Skripts mit "_BASS_Free()" alle benutzen Ressources wieder freizugeben? Sollte man es zwecks Stabilität immer machen oder ist es eher Formsache?


    [autoit]

    Func _Exit()
    _BASS_Free()
    Exit
    EndFunc

    [/autoit]


    Hierbei dauert es teils bis zu 5 Sekunden (wenn über Stunden neue Streams erstellt wurden, +100) bis das Skript beendet wird (geschätzte Werte). Ist unschön, aber ansonsten okay.


    [autoit]

    Func _Exit()
    _BASS_ChannelSetVolume($_BASS_StreamCreateFile, 0)
    Exit
    EndFunc

    [/autoit]


    Hierbei endet das Skript sofort, es gibt aber einen "Nachhalleffekt" für vllt 2 Sekunden, kann ich aber durch das Volume-Ausschalten des Channels umgehen. Nur hier halt kein "_BASS_Free()".


    Was sagt Ihr dazu? Vllt lesen ja Prog@ndy, eukalyptus oder andere Bass.au3-User das und helfen mir weiter...

    Gruß Andy :)

    Einmal editiert, zuletzt von AndyTR (2. März 2012 um 22:41)

  • Man sollte die Free-Funktionen immer aufrufen. Wie erstellst du die neuen Streams denn? Wenn es am Ende so lange dauert, dann vergisst du vermutlich irgendwo dazwischen das Aufräumen.

    Ich würde folgendes per OnAutoItExitRegister ausführen lassen: zuerst Lautstärke auf 0 setzen, dann Ressourcen freigeben (Zuerst Stream stoppen, dann Stream freigeben, zuletzt DLL freigeben)

  • [autoit]

    _BASS_StreamFree($StreamCreateFile)
    _BASS_StreamFree($Track)
    $StreamCreateFile = _BASS_StreamCreateFile(0, $Array_Tracks[$Line], 0, 0, $BASS_STREAM_DECODE)
    Global $Track = _BASS_FX_TempoCreate($StreamCreateFile, 0)
    _BASS_ChannelPlay($Track, 1)

    [/autoit]


    Quasi dies hier geschieht immer- und immerwieder innerhalb einer Fkt, natürlich ohne beim allerersten Mal die beiden "_BASS_StreamFree()" zu setzen. Daher müsste zwischendurch eigentlich alles richtig wieder freigegeben werden, denke ich.
    Was kann denn maximal geschehen beim Nicht-Freigeben, gibts dazu Erfahrungen?

    Gruß, und danke schonmal, wahnsinnig schnelles Feedback :)

    Edit: Jetzt dauerts erstmal etwas bis ich mich wieder melde.

  • Als erstes solltest du die Reihenfolge einhalten, also Zeile 1 und 2 vertauschen. Denn dein $Track hängt von $Stream... ab, daher kann es Probleme geben, wenn $Stream zuerst freigegeben werden soll. Und vor dem freigeben ist ein Aufruf von _Bass_ChannelStop zu empfehlen.

  • Okay, erstmal vielen Dank dir Andy :)
    Jetzt klappt das, ich hatte noch einen weiteren Stream übersehen, der zwischendurch immer voller geworden ist.

    Weitere Frage: _BASS_Startup(...\bass.dll") lässt sich ja freigeben, geht das auch mit _BASS_Encode_Startup(...\bassenc.dll") und _BASS_FX_Startup(...\bassfx.dll") ?

  • Die DLLs werden nirgends freigegeben, auch bei _BASS_Free nicht. Dort wird eine DLL-Funktion aufgerufen, die bestimmte Ressourcen sauber freigibt. Die DLLs selbst muss man nicht entladen, daher gibt es diese Funktion bei den anderen UDFs nicht.


  • Ja, aber nur während des Programmlaufs, ich denke, dass hast du auch gemeint :thumbup:
    Nach Beendigung des Programms räumt Windows den Speicher auf. (Abgesehen von irgendwelchen "manipulierten" Speicherbereichen anderer Prozesse).
    Übrigens kann man das relativ einfach prüfen, indem man im Task-Manager die Speicher"verbräuche" anzeigen lässt. Steigt während eines Programmlaufs der Speicherverbrauch permanent, hat man irgendwo ein "Leak". Gleiches gilt übrigens auch für GDI-Objekte, bzw Objekte im Allgemeinen.
    Daher kann man

    Zitat

    Wie wichtig ist es am Ende eines Skripts mit "_BASS_Free()" alle benutzen Ressources wieder freizugeben?

    mit "unwichtig, aber unsauber" beantworten

  • mit "unwichtig, aber unsauber" beantworten


    Normalerweise schon. Es könnte aber der sehr unwahrscheinliche Fall auftreten, dass das Betriebssystem beim Beenden eines Prozesses solche Sachen nicht ganz sauber aufräumt.

  • Zitat von progandy

    ...dass das Betriebssystem...

    wobei wir beim Thema wären :D

  • Auch mal eine frage:
    Was ist denn so toll an der "BASS.dll" ? welche vorteile hat man da so?^^

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes: