Entwickler-Ecke
Windows API - Ramcleaner
viper3001 - Do 04.03.10 17:11
Titel: Ramcleaner
Hi leute^^
Da ich vor 1 jahr etwa mit delphi durch die schule angefangen hab und schnell merkte das ich meinem schulstoff vorraus bin (>_>) probiere ich mich zu hause nebenbei immer etwas mit delphi auseinander zu setzten. Soweit klappt auch alles doch nun hab ich 1 prob. ^.^
und zwar hab ich aus ner älteren autoit datei nen schicken dll use gefunden
Quelltext
1: 2: 3:
| Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $procpid) DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0]) DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0] |
da mir autoit aber zu simpel war/ist will ich möglichst alles was ich mal geschrieben hab umschreiben.
Der obere code sorgt soweit dafür das man ein process recht gut runterdrosseln kann im ramverbrauch. Nur ist nun das problem das es nicht hinbekomme es in delphi umzuschreiben ^^"
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.Button4Click(Sender: TObject); var handle: THandle; winver: TProc; pid:Integer; begin pid :=FindWindow(nil,'Startseite von Mozilla Firefox - Mozilla Firefox'); GetWindowThreadProcessId(pid ,@pid); handle := LoadLibrary('psapi.dll'); if handle = 0 then begin ShowMessage('Laden fehlgeschlagen'); Exit; end; @winver := GetProcAddress(handle, 'EmptyWorkingSet'); if @winver <> nil then begin result :=(pid); end; Label1.Caption := IntToStr(Lo(winver)) + '.' + IntToStr(Hi(winver)); FreeLibrary(handle); end; |
damit habe ichs bisher probiert. Nur wie und wo mach ich die parameter geschichte von oben? und kann ich evtl die handle adressen per delphi einfacher beziehen so das ich quasi nur die psapi.dll usen muss?
Jede art von hilfe ist mir recht =)
sitze jetzt schon paar tage an dem problem fest.
MfG
Viper
Moderiert von
Narses: Topic aus Dateizugriff verschoben am Do 04.03.2010 um 17:00
Astat - Do 04.03.10 17:29
Hallo viper3001, ist zwar ein Performancekiller, aber
Delphi-Quelltext
1:
| SetProcessWorkingsetsize(GetCurrentProcess, $ffffffff, $ffffffff); |
lg. Astat
viper3001 - Do 04.03.10 17:44
hmm wie darf ich das jetzt verstehen? gibs son befehl schon in delphi und ich muss nur max und min wert der für den process zugeteilt werden soll eingeben o_O? Wie sieht das dann aus wenn ein prozess max 20mb ram bekommen soll und mind. 15?
Edit: lol jo den befehl gibs schon xDD bin ich doof^^ kannste mir trotzdem sagen welchen befehl ich statt GetCurrentProcess brauche um das auf andere anzuwenden? Am besten wäre windowname oder so. Und halt das ich weiß welchen bereich ich angeben muss für 15-20mb. Danke schonmal =)
Delete - Do 04.03.10 18:14
viper3001 hat folgendes geschrieben : |
| Der obere code sorgt soweit dafür das man ein process recht gut runterdrosseln kann im ramverbrauch. |
Was soll der Code machen bzw. was willst du erreichen?
viper3001 - Do 04.03.10 18:17
Delphi-Quelltext
1:
| SetProcessWorkingsetsize(GetCurrentProcess, $ffffffff, $ffffffff); |
damit hauts ja schon super hin. (Wusste nicht das es sowas schon gibt^^) will bloß halt das auf andere fenster anwenden. Möglichst durch Fensternamen eingabe und dann wirds gedrosselt. Müsste dazu nur noch wissen wie man den bereich selber definieren kann. Geht halt darum von anderen Programmen den Ram runterzuschrauben.
Xentar - Do 04.03.10 18:27
Was wird denn das, wenns fertig ist?
Wieso willst du andere Programme im RAM Verbrauch "drosseln"?
Delete - Do 04.03.10 18:32
viper3001 hat folgendes geschrieben : |
| Geht halt darum von anderen Programmen den Ram runterzuschrauben. |
Das ist Blödsinn. Wenn ein Programm 500 MB braucht, dann braucht es 500 MB. Alles was du damit erreichst ist, dass du Windows zwingst den Speicher auszulagern auf die langsame Festplatte in das Pagefile. So bald der Prozess aber wieder aktiv wird schaufelt Windows die Daten wieder in den RAM. Alles was du also erreichst ist, dass du Windows zwingst Daten hin und her zu schaufeln und zwar unnötiger weise. Ein Eingriff in den Speichermanager von Windows ist immer eine schlechte Idee, denn Windows weiß am besten, wie es den Speicher zu verwalten hat. Siehe dazu auch:
http://www.michael-puff.de/Artikel/WindowsMemoryManagement.shtml
viper3001 - Do 04.03.10 18:46
... das brauchste mir nicht erzählen ich weiß schon was ich mache lol. Ich hab das per autoit ja schon seit monaten so gemacht und den zweck den es erfüllen soll tut es. Kannste mir die 2 fragen noch beantworten?
Delete - Do 04.03.10 18:57
Der Zweck ist es also den Windows Speichermanager auszubremsen? Na wenn du meinst.
Mit OpenProcess kannst du dir ein Handle auf einen anderen Prozess holen.
viper3001 - Do 04.03.10 19:54
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button4Click(Sender: TObject); var pid:Integer; begin pid :=FindWindow(nil,'Startseite von Mozilla Firefox - Mozilla Firefox'); GetWindowThreadProcessId(pid ,@pid);
SetProcessWorkingsetsize(OpenProcess(SYNCHRONIZE, False, pid), $ffffffff, $ffffffff); end; |
ist das dann so richtig? aber da passiert nix ^^" und wie muss ich die parameter einstellen wen ich nicht will das sie zu stark drosseln?
Delete - Do 04.03.10 22:19
Alle Windows API Funktionen haben einen Rückgabewert. Es wäre wahrscheinlich nicht die schlechteste Idee diese mal auszuwerten und sich anzeigen zu lassen.
viper3001 - Fr 05.03.10 15:08
Delphi-Quelltext
1: 2: 3: 4:
| Window := FindWindow(nil,'Startseite von Mozilla Firefox - Mozilla Firefox'); GetWindowThreadProcessId(Window,@PID);
edit1.text:=booltostr(SetProcessWorkingsetsize(OpenProcess(PROCESS_ALL_ACCESS,false,PID), $ffffffff, $ffffffff)); |
danke für die hilfe jetzt funzt es wie es soll. Rückgabewert im editfeld ist dann -1 wenns klappt.
MfG
Viper
Xentar - Fr 05.03.10 16:09
Trotzdem würde mich der Sinn der Aktion noch interessieren..
Wenn es dir darum geht, das Speicherleck des Firefox zu "beheben", dann hilft ein Neustart wohl eher weiter. Oder war das nur ein Beispiel?
viper3001 - So 07.03.10 17:53
die sache ist das ich teilweise das prob mit firefox hab und außerdem dazu noch mehrere programme laufen hab die aber eh nur minimiert sind. Da die mir aber zu viel ram ziehen hab ich mir gedacht ich drossel die irgendwie^^.
Mein problem momentan ist aber das bei einem freund mit win7 32 bit gar nicht funktioniert bei allen programmen oder testweise bei spielen.
Windows Server 2003 and Windows XP/2000: The size of the PROCESS_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP/2000, the PROCESS_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation. If PROCESS_ALL_ACCESS must be used, set _WIN32_WINNT to the minimum operating system targeted by your application (for example,
#define _WIN32_WINNT _WIN32_WINNT_WINXP
)
diese beschreibung hab ich dann gefunden bloß wie setzte ich das dann? und liegt es überhaupt auch daran? Das soll ja möglichst auf allen systemen laufen falls ich das wem schicken will^^.
Boldar - So 07.03.10 18:04
viper3001 hat folgendes geschrieben : |
die sache ist das ich teilweise das prob mit firefox hab und außerdem dazu noch mehrere programme laufen hab die aber eh nur minimiert sind. Da die mir aber zu viel ram ziehen hab ich mir gedacht ich drossel die irgendwie^^.
|
Das erkennt der Speichermanager aber afaik automatisch, und lagert die as erstes aus, wenn der Ram knapp wird.
Gausi - So 07.03.10 18:12
Hört sich für mich wie ein herumdoktorn an den Symptomen an, ohne die Ursache zu bekämpfen.
Wenn man viele speicherhungrige Programme gleichzeitig laufen lassen möchte, sollte man entweder auf alternative Programme umsteigen, die dieses Problem nicht haben, oder seinen Speicher aufrüsten.
Hidden - So 07.03.10 18:18
Hi :)
Wenn du an große Schritte glaubst, kannst du dir ja mal die Demo von TuneUp Utilities 2010 runterladen. Da ist dann unter anderem ein Mem Optimizer drin, der afaik genau das macht("die Auslagerungsdatei dynamisieren"). Meine Erfahrung: Das bremst hauptsächlich, und zwar wenn ein solches Fenster nun doch wieder in den Vordergrund geholt werden soll.
Anzeigen tut mir das schöne Stück am PC meines Vaters übrigens permanent, dass Firefox hier 75% des Arbeitsspeichers frisst. :D
Angeboten wird sogar ein Turbo Modus für Windows. :lol:, der unterdrückt dann unwichtige Sachen wie Hintergrunddienste, etc(leicht schizophren, etwas erst selbst als "beschleunigende Ergänzung" zu betreiben, und dann die von WIndows bereits betriebene Arbeit zu verhindern).
Ich favouisiere ja die Alternative: Unnötiges aus dem Autostart raus, und wenn das nicht reicht ein wenig mehr Arbeitsspeicher.
lg,
E: Mist, zu spät :D
viper3001 - So 07.03.10 18:23
jo das weiß ich ja dennoch danke^^. Eigentlich haut ja alles soweit hin muss halt nurnoch auch auf 32bit win7 oder auch xp oder so laufen dann bin ich zufrieden damit wie es ist. Denke mal das Process_ALL_Access, wie in diesem einem beitrag, ja nicht immer gleich dann ist. Daher würd ich gern wissen wie ich das os dann definiere damit es geht.
Delete - So 07.03.10 20:52
Für PROCESS_ALL_ACCESS brauchst du Administratorenrechte. Ist also keine Lösung, wenn der Benutzer nicht ständig als Administrator an seinem Rechner arbeitet.
viper3001 - So 07.03.10 22:30
hmm das komische ist ja admin haben alle bloß bei einigen programmen geht das nicht und das komischerweise bei 32bit windows. bei 64 (wie auch bei mir) geht alles so wie es soll.
Delete - Mo 08.03.10 09:28
Was Du schreibst, lässt sich nur schwer lesen.
Optimiere doch erst mal Deine Schreibweise: Schreibe mit Punkt und Komma und entsprechend der deutschen Rechtschreibung!
viper3001 - Di 09.03.10 19:40
hat sich eh geklärt. Nun funktioniert alles.
viper3001 - Do 29.04.10 18:11
so mitlerweile hab ich das tool soweit super hinbekommen und das ist jetzt auch schon ne weile her.
Bloß ein großes problem hab ich und zwar funzt es komischerweise unter win7 64x bit super aber unter vista xp und auch win7 86xbit geht es bei einigen prozessen nicht.
Kann dass an der Psapi versions nummer liegen? Falls ja wie gebe ich eine im programm an? Falls nicht woran liegt das dann sonst?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!