RAM geheugen vrijmaken

Alles over het toepassen van API en DLL's in Liberty BASIC

Moderator: anthonio

RAM geheugen vrijmaken

Berichtdoor anthonio » wo aug 13, 2008 11:28 pm

Enkele maanden geleden had ik eens gevraagd of er een API bestond om het ram geheugen te defragmenteren.
Nu deze API's bestonden alleen het omzetten van VB naar LB was moeilijker dan gedacht.
Toevallig was ik vandaag men noties even aan het doornemen hiervan en na wat te prutsen en verschillende restarts kom ik toevallig tot de oplossing.
Had een api call verkeerd gedeclareerd.
oke over dan naar de code.
Het concept is eigenlijk zo simpel als wat en elk commercieel programma dat je geheugen vrijmaakt past deze methode toe.
Met andere woorden, je kan even goed de code hieronder gebruiken dan dat je je geld uitgeeft aan een prog omdat het er mooier uitziet.
Je geheugen wordt eigenlijk volgepompt met nullen en getallen om daarna deze te verwijderen (loslaten).
Door dit te doen worden de lege gaten in je RAM geheugen volgestoken om daarna deze weer te verwijderen.
Het ram geheugen gaat hierdoor weer alles netjes bij mekaar zetten.
Hetzelfde wordt toegepast om je harde schijf te defragmenteren.
BELANGRIJK: in de code staat er in het midden een kleine uitleg die je zelf dient aan te passen aan je computer.
Standaard staat het programma goed voor een computer met 512MB RAM geheugen.
Heb je meer of minder dan MOET je dit aanpassen.
Vooral voor computers die minder hebben moet je dit getal van 7 cijfers aanpassen anders krijg je een fatal error in LB en sluit deze af.
Het programma is VOLKOMEN VEILIG voor je computer.
Oke genoeg uitleg hier volgt dan de beroemde code :mrgreen:

Code: Selecteer alles
'Made by anthonio (Andy)
'Use is free, selling this application is not allowed
'This app will fill your memory with zero's and numbers
'after the mem is full all those numbers will be deleted (released)
'by doing this the memory will defrag itself.

nomainwin

WindowWidth = 100
WindowHeight = 100

button #main, "Test", [RAM], UL, 10, 10

open "Ram Saver" for window as #main
#main, "trapclose [Quit]"
wait

[RAM]

elements = 75
dim structArray(elements)

'1000000 for a & b = 128MB RAM
'2000000 for a & b = 256MB RAM
'3000000 for a & b = 512MB RAM
'5000000 for a & b = 1024MB RAM and so on
struct ram,_
a as char[3000000],_
b as char[3000000],

size = len(ram.struct)
memsize = (elements + 1) * size
open "kernel32.dll" for dll as #kernel
array = GlobalAlloc(memsize)
timer 500, [Next]
wait

[Next]
timer 0
arraylock = GlobalLock(array)
timer 500, [Next2]
wait

[Next2]
timer 0

for i = 1 to 75
    ram.a.struct = "0 " + str$(i)
    ram.b.struct = "0 " + str$(i)
    dest = arraylock + (i*size)
    calldll #kernel, "RtlMoveMemory", dest as long, ram as ptr, _
                                      size as long, ret as void
    structArray(i) = dest
next i
timer 500, [Next3]
wait

[Next3]
timer 0

ret = GlobalFree(array)
close #kernel
notice "Ram gedefragmenteerd"
wait

[Quit]

close #main
end

function GlobalAlloc(dwBytes)
    calldll #kernel, "GlobalAlloc", _GMEM_MOVEABLE as long, dwBytes as ulong,_
                                    GlobalAlloc as long
end function

function GlobalLock(hmem)
    calldll #kernel, "GlobalLock", hmem as long, GlobalLock as long
end function

function GlobalFree(hmem)
    calldll #kernel, "GlobalFree", hmem as long, GlobalFree as long
end function


note: om het verschil te zien kan je BV het programma statbar (http://www.statbar.nl) op je computer zetten. Dit programma toont het RAM geheugen van je computer.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Keer terug naar API/DLL

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron