Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie frage ich die noch verfügbaren Windows-Resourcen ab? (https://www.delphipraxis.net/115882-wie-frage-ich-die-noch-verfuegbaren-windows-resourcen-ab.html)

Stephan P. 19. Jun 2008 13:41


Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Hallo,

einem meiner Programme (oder besser gesagt, einem Programm, dass ein Benutzer mit meiner VCL-Komponentenbibliothek geschrieben hat), gehen anscheinend die Windows-Resourcen aus.

Ich wollte mir jetzt erst mal einen Überblick darüber verschaffen, wie das Programm mit den Resourcen umgeht. Wahrscheinlich bin ich blind, aber ich finde in der Delphi-Hilfe keine Funktion/Methode, mit denen sich die noch verfügbaren Windows-Resourcen (z.B. Windows-Handles) abfragen lassen. Kann mir da vielleicht jemand weiter helfen?

Ich benutze im Moment D7 auf WinXP, habe aber ab D5 auch alle anderen Delphi-Versionen zur Verfügung.

Vielen Dank im Voraus für Eure Hilfe,

Stephan

Luckie 19. Jun 2008 13:49

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Mit Hilfe eines Profilers solltest du die Speicherlecks finden können.

Hm, jetzt bin ich mir nicht mehr sicher, ob man die Dinger so nennt. Aber ich glaube FastMem kann so was auch.

Bernhard Geyer 19. Jun 2008 13:53

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Zitat:

Zitat von Stephan P.
Wahrscheinlich bin ich blind, aber ich finde in der Delphi-Hilfe keine Funktion/Methode, mit denen sich die noch verfügbaren Windows-Resourcen (z.B. Windows-Handles) abfragen lassen. Kann mir da vielleicht jemand weiter helfen?/quote]
Ich glaube nicht das es sowas gibt. Windows wird selbst nicht so genau wissen wieviele Handels es für den Prozess noch übrig hat.

Zitat:

Zitat von Luckie
Hm, jetzt bin ich mir nicht mehr sicher, ob man die Dinger so nennt. Aber ich glaube FastMem kann so was auch.

Nur wenn für jede GDI-Ressource ein Delphi-Objekt übrig bleibt. Für reine GDI-Ressourcen ist FastMM "blind". Hier ist u.U. AQTime sinnvoll einzusetzen.

Sherlock 19. Jun 2008 13:59

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Ich hab da was altes gefunden...das ist allerdings sehr alt.

Delphi-Quellcode:
function GetFreeSystemResources(SysResource: Word): Word;
var
  huser16, huser32: THandle;
  ThunkTrash: array[0..$20] of Word;
  fp, qfp: Pointer;
begin
  result := 0;
  if (SysUtils.Win32PlatForm = VER_PLATFORM_WIN32_NT) then
    exit; // NT
  huser16 := 0;
  huser32 := 0;
  try
    ThunkTrash[0] := huser16;
    huser16 := LoadLibrary16('user.exe');
    fp := GetProcAddress16(huser16, 'GetFreeSystemResources');
    huser32 := LoadLibrary('Kernel32');
    qfp := GetProcAddress(huser32, 'QT_Thunk');
    if (fp = nil) or (qfp = nil) then
      exit;
    asm
      push SysResource
      mov edx, fp
      call qfp
      mov Result, ax
    end;
  finally
    FreeLibrary16(huser16);
    FreeLibrary(huser32);
  end;
end;
Edit: Das Ergebnis sind wohl die freien Ressourcen in %...oder so ähnlich :mrgreen:

Sherlock

Stephan P. 19. Jun 2008 14:08

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Hallo Michael,

Zitat:

Zitat von Luckie
Mit Hilfe eines Profilers solltest du die Speicherlecks finden können.

danke für den Hinweis, aber ich gehe erst mal nicht davon aus, dass es sich um ein Speicherleck handelt. Hier werden wirklich (testweise) tausende Komponenten dynamisch angelegt, die von TCustomPanel abstammen. Mir würde es erst mal reichen, wenn ich eine passende Delphi-Funktion oder -Methode hätte, mit der ich ein Auge auf die noch verfügbaren Resourcen werfen könnte.

Viele Grüße,

Stephan

Stephan P. 19. Jun 2008 14:10

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Hallo,

Zitat:

Zitat von Sherlock
Ich hab da was altes gefunden...das ist allerdings sehr alt.

über GetFreeSystemResources bin ich auch schon gestolpert, aber das scheint noch aus 16-bit Delphi-Zeiten zu stammen...


Viele Grüße,

Stephan

Sherlock 19. Jun 2008 14:13

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Genau...laut MS gibt diese Routine unter W2k und XP immer 90% zurück ^^

Wie auch immer, hier noch ein weiter führender Link dazu:
http://support.microsoft.com/?scid=k...4924&x=18&y=11

Ich glaube auch, daß sowas nicht mehr benötigt wird.

Sherlock

Bernhard Geyer 19. Jun 2008 14:23

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Zitat:

Zitat von Sherlock
Ich glaube auch, daß sowas nicht mehr benötigt wird.

(GDI-)Resourcen sind auch unter Vista/2008 noch eine beschränktes Gut. Die Anzahl der verfügbaren Ressourcen wächst jedoch mit jeder Windows-Version.

OldGrumpy 19. Jun 2008 14:27

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
Zitat:

Zitat von Stephan P.
danke für den Hinweis, aber ich gehe erst mal nicht davon aus, dass es sich um ein Speicherleck handelt. Hier werden wirklich (testweise) tausende Komponenten dynamisch angelegt, die von TCustomPanel abstammen. Mir würde es erst mal reichen, wenn ich eine passende Delphi-Funktion oder -Methode hätte, mit der ich ein Auge auf die noch verfügbaren Resourcen werfen könnte.

Das wird alleine schon bei den Windowhandles knapp, fürs Userland sind (bei XPXP2, wie es unter anderen Versionen aussieht, kann ich auf Anhieb nicht sagen) ohne Klimmzüge nur ca. 10.000 davon verfügbar - wenn die weg sind, schlagen Aufrufe zum Erzeugen eines neuen Fensters usw. einfach fehl und das wars. Diese Situation hatte ich mit dem IE7 häufig da ich dort etliche Tabs offen hatte (von denen frisst jedes unglaubliche Mengen an Handles) - man merkts dann erst wenn keine Fenster mehr aufgehen :) IE7 zumachen oder unbenötigte Tabs schließen und schon gehts wieder.

Muetze1 20. Jun 2008 00:23

Re: Wie frage ich die noch verfügbaren Windows-Resourcen ab?
 
1. Ein Profiler kann die Laufzeiten in Programmteilen ermitteln - wie sollte dieser bei Speicherlecks helfen? Bitte auf Fachbegriffe achten, wenn sie schon genannt werden und nicht vollkommen verkehrt. (Luckie :warn: )
2. Bei Delphi kommt man leicht in die Bedrängnis mit den Resourcen, da viele einfache Objekte mehr Handles benötigen als man braucht. Ein TCanvas beinhaltet neben dem HDC auch gleich noch einen HPEN und HBRUSH.
3. Bei Win95 waren Windowsglobal ein GDI Handleliste von 32K verfügbar. Ab Win98 waren es schon 64K und mit ME wurde es auf 92K angehoben. Mit NT und deren Nachfolgern wurden die Handles dynamisch gehandhabt, aber trotzdem sind sie begrenzt. Hier greift aber eher der Windows eigene Schutz und so wird u.a. ein Prozess mit mehr als 20.000 reinen GDI Handles sang und klanglos beendet. Die VCL hält es manchmal durch die Exceptions nicht mehr aus und zerschiesst das Programm auch mal selber vor dieser Grenze, da es noch manche Ecken der VCL gibt, wo die alloziierten Handles nicht überprüft werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz