| Autor |
Beitrag |
viper3001
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 04.03.10 17:11
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
Zuletzt bearbeitet von viper3001 am Sa 09.06.12 23:54, insgesamt 3-mal bearbeitet
|
|
Astat
      
Beiträge: 75
Erhaltene Danke: 1
Windows 2000
D6, D7, D2007, Lazarus
|
Verfasst: Do 04.03.10 17:29
Hallo viper3001, ist zwar ein Performancekiller, aber
Delphi-Quelltext 1:
| SetProcessWorkingsetsize(GetCurrentProcess, $ffffffff, $ffffffff); |
lg. Astat
|
|
viper3001 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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 =)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 04.03.10 18:27
Was wird denn das, wenns fertig ist?
Wieso willst du andere Programme im RAM Verbrauch "drosseln"?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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: www.michael-puff.de/...moryManagement.shtml
|
|
viper3001 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
viper3001 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: 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
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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.
Angeboten wird sogar ein Turbo Modus für Windows.  , 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 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
viper3001 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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.
|
|