ich habe die Demo von SmartGC getestet und festgestellt, das Tool verspricht mehr als es hält. Jedenfalls konnte ich bei einer unserer Anwendung ( 32 MB Exe-file inkl DLLs) keine Verbesserung des Speicherverhaltens feststellen.
Martin hat mich darauf aufmerksam gemacht hat, dass der Speicherbedarf einer Anwendung sich reduzieren lässt, wenn die Anwedung minimiert und anschließend wieder maximiert wird.
Ich habe das getestet und folgende Funktion „ClearMem() innerhalb einer Anwendung implementiert:
Code: Alles auswählen
DLLFUNCTION GetForegroundWindow() USING STDCALL FROM USER32.DLL
DLLFUNCTION ShowWindow( nHwnd, nCmdShow ) USING STDCALL FROM USER32.DLL
Func ClearMem()
Local nHandle := GetForegroundWindow()
ShowWindow( nHandle, SW_MINIMIZE )
ShowWindow( nHandle, SW_RESTORE )
Return ( NIL
Soweit so gut.
Ich bin bei MSDN auf folgendes API-Funktion gestoßen: SetProcessWorkingSetSize.
Näheres dazu unter:
http://msdn.microsoft.com/library/defau ... etsize.asp
http://support.microsoft.com/?scid=kb;EN-US;293215
Wenn ich das richtig verstanden habe, kann über diese API-Funktion analog zum Minimize/Maximize Speicher freigegeben werden. Nur, auf Basis der nachfolgenden Funktion funktioniert es bei mir nicht:
Code: Alles auswählen
DLLFUNCTION SetProcessWorkingSetSize( nPid, nMin, nMax ) USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION GetWindowThreadProcessId( nForgroundHwnd, @nRetProcId ) USING STDCALL FROM USER32.DLL
DLLFUNCTION GetForegroundWindow() USING STDCALL FROM USER32.DLL
Procedure main
....
Clearmem2()
....
Return
Func ClearMem2()
Local nHandle := GetForegroundWindow()
Local nPID
nPid := GetWindowThreadProcessId( nHandle, 0)
SetProcessWorkingSetSize( nPid, -1, -1 )
Return ( NIL )
Habe ich etwas übersehen oder eignet sich die API-Funktion nicht dafür?
Gruß, Olaf