Memory Reduce [Memory Bereinigung]

    • Offizieller Beitrag

    Hallo!

    Ich habe mal wider ein programm geschrieben^^ diese programm reduziert die Memoryauslastung des processes des momentan aktiven Fensters. Also z.b. wenn momentan der firefox gestartet ist und man das programm startet, wird die memorylast von firefox.exe kurzzeitig auf 0 gestellt (das geht natürlich sofort wider hoch, aber meist nie soweit wie am anfang (ausser beim firefox, da geht es rechtschnell wider in den anfangszustand))

    vlt kanns ja jemmand gebrauchen (ich z.b. brauch es wenn ich google earth und firefox usw gleichzeitig gestartet hab..habs bei mir auch auf nem hotkey laufen (über die G15))

    Hier nun das skript, beendet wird es mit ESC und 100% ist der Anfangs zustand(vor der Bereinigung)!

    Spoiler anzeigen
    [autoit]

    ;#################
    ;# Reduce Memory #
    ;# By Gtaspider #
    ;#################
    ;Includes
    #include <process.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Optionen/Hotkeys
    HotKeySet("{ESC}","_exit")
    Opt("WinTitleMatchMode", 4)
    $taskbar_pos = WinGetPos("classname=Shell_TrayWnd")
    $taskbar_pos = $taskbar_pos[3]
    Opt("WinTitleMatchMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ;Globals
    Global $pid,$name,$startram,$Proggui

    [/autoit] [autoit][/autoit] [autoit]

    ;Auslesen des Processes des momentanen Fensters
    $title = WinGetTitle("")
    $pid = WinGetProcess($title)
    $name = _ProcessGetName($pid)
    If $name = "explorer.exe" Then
    $name = InputBox("", "process name:", "explorer.exe")
    $pid = ProcessExists($name)
    EndIf
    If Not $pid Then Exit
    ;Den Anfangs ram (vor der Bereinigung) auslesen
    $startram = _GetRam($pid)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUI
    $Proggui = GUICreate("", 296, 50, @DesktopWidth - 296, @DesktopHeight- (50 + $taskbar_pos), $WS_POPUP,$WS_EX_TOOLWINDOW)
    WinSetOnTop($Proggui, "", 1)
    GUISetBkColor(0x004F4F)
    $Progress = GUICtrlCreateProgress(8, 8, 278, 16)
    GUICtrlSetData(-1, 100)
    $lab = GUICtrlCreateLabel("100%", 132, 8, 30, 16, $SS_SUNKEN)
    GUICtrlSetColor(-1, 0x00FFFF)
    $kllab = GUICtrlCreateLabel($name & " Uses: " & $startram & "kb", 8, 32, 275, 17)
    GUICtrlSetColor(-1, 0x00FFFF)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Proggui, "int", 500, "long", 0x00040008);slide-in from bottom
    WinSetOnTop($Proggui, "", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ;Bereinigung der Memoryauslastung des Prozesses

    [/autoit] [autoit][/autoit] [autoit]

    ;Prozess PID zu Prozess Handle
    $Pr_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $pid)
    ;Memory wird auf 0 gestellt
    DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $Pr_Handle[0])
    ;Prozess Handle wird geschlossen
    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $Pr_Handle[0])

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Alle 750 ms nach dem RAM gucken
    AdlibEnable("_UpdateRam", 750)

    [/autoit] [autoit][/autoit] [autoit]

    ;Main While, damit das Skript nicht beendet wird
    While 1
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;_exit, beendet das Skript mit einem fade out der GUI
    Func _exit()
    DllCall ( "user32.dll", "int", "AnimateWindow", "hwnd", $Proggui, "int", 500, "long", 0x00090000 );fade-out
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;_UpdateRam, gut sich alle 750ms an wieviel Memoryauslastung der Prozess hat
    Func _UpdateRam()
    If Not ProcessExists($pid) Then
    AdlibDisable()
    GUICtrlSetData($Progress,0)
    For $i = 30 To 0 Step - 1
    $set = $i
    If StringLen($set) < 2 Then $set = "0" & $i
    $set = StringLeft($set, 1) & "." & StringRight($set, 1)
    GUICtrlSetData($kllab,$name&" was terminated! Exit in "&$set)
    GUICtrlSetData($lab,$set)
    Sleep(100)
    Next
    _exit()
    EndIf
    $ram = _GetRam($pid)
    GUICtrlSetData($kllab, $name & " Uses: " & $ram & "kb")
    $prog = (100 * $ram) / $startram
    GUICtrlSetData($Progress, $prog)
    GUICtrlSetData($lab, Round($prog) & "%")
    Return 1
    EndFunc ;==>_UpdateRam

    [/autoit] [autoit][/autoit] [autoit]

    ;_GetRam($iProcPid), gibt die Memoryauslastung der angegebenden PID zurück
    Func _GetRam($iProcPid)
    Local $colItems = "",$Output = ""
    $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Process", "WQL", 0x30)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    For $objItem In $colItems
    If $objItem.ProcessId = $iProcPid Then Return $objItem.WorkingSetSize / 1024
    Next
    Else
    MsgBox(48, "WMI Output", "No WMI Objects Found for class: " & "Win32_Process")
    Exit
    EndIf
    EndFunc ;==>_GetRam

    [/autoit]

    Mfg Spider

    Edit: nur eine kleine unschönheit.. unten in der taskleiste wird die gui angezeigt, das ist nun gefixt..
    Edit2:Wenn der Prozess beendet wird, schließt sich das Programm nach 3 sekunden. Ausserdem Reduce im Thematitel geschrieben anstatt Reduze ;)

  • 1) danke, das proggi is hilfreich beim switchen von spiel / browser/ mp3 xD


    2) Aspirin, weisst du obs ne liste gibt, von allen about:config einträgen?

    Fand den tipp echt geil und würd gern wissen obs da noch mehr interessantes gibt

    € gefunden X(

    Einmal editiert, zuletzt von huggy (3. März 2007 um 16:38)