Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kontrolle freier System-, User- und GDI-Ressourcen unter Win (https://www.delphipraxis.net/4458-kontrolle-freier-system-user-und-gdi-ressourcen-unter-win.html)

Dirk Reichert 30. Apr 2003 06:47


Kontrolle freier System-, User- und GDI-Ressourcen unter Win
 
Da ich unter Windows 98 Probleme mit der 64 K Grenze für Windows-Handles habe, will ich in meinem Programm die Ressourcen ähnlich der Ressourcenverwaltung von Windows überwachen.
Kann ich nicht z.B. über einen Timer die Systemressourcen überwachen und entsprechende Warnungen ausgeben? Müsste doch eine Möglichkeit geben, die Ressourcenverwaltung von WIndows warnt ja auch bei 90 % Auslastung.
Exception (eigentlich müssten dies EOSERROR oder EOUTOFRESSOURCES sein)habe ich an alle Stellen im Programm ausgewertet, sie werden aber einfach nicht ausgelöst. Vielleicht liegt das ja da dran, dass das ganze Windows zu diesem Zeitpunkt (keine freien Ressourcen) total instabil ist.
Meistens kommen bei diesen Systemabstürzen irgendwelche leeren Meldungsfenster. Wer kan helfen?

Viele Grüße

Dirk
:roll:

roderich 30. Apr 2003 08:48

hallo Dirk,

das mit der Exception EOutOfResources ist in der Tat so eine Sache. Wenn ich sie unter Win98 bekomme, ist es manchmal auch schon zu spät, das System war dann oft völlig instabil -> nur noch Reboot.

Theoretisch sollte das mit dem Timer klappen, der aber nicht zu hoch aufgelöst laufen sollte (so alle paar Sekunden vielleicht).

Mit GlobalMemoryStatus kannst Du einige Statusinfos zum gegenwärtigen Speicherverbrauch bekommen. Leider aber nicht die Anzahl freier Handles, wenn ich mich recht erinnere.

Wenn Du weißt, wie man die Zahl verbrauchter/freier Handles bekommt, wär ich Dir für ein Posting dankbar.

vGrüße
Roderich

Dirk Reichert 2. Mai 2003 09:19

Sparsamster Umgang mit Systemressourcen unter Windows 98
 
Für große MDI-Childforms mit vielen Controls sind bekanntlich die Systemressourcen unter Windows 98 begrenzt auf 64 KB. Um dies zu lösen habe ich in den Forms ein PageControl mit TabSheets welche als erstes Control ein TPanel mit alClient bekommen eingebaut. Innerhalb dieses PageControls befinden sich alle Controls.

Mit DestroyHandle habe ich die Handles aller Controls, welche sich auf im Augenblick nicht sichtbaren TabSheets befinden freigegeben. Über CreateHandle hole ich mir die Handle für die Controls des sichtbaren TabSheets zurück.
Für meine User-Ressourcen hatte das vollen Erfolg, die Zahl verringert sich jetzt bei jedem neuen Child-Form nur sehr gering. War ein voller Erfolg.
Allerdings bleiben leider meine GDI-Ressourcen im Keller.

Vielleicht mal bischen genauer. Ich laufe im Change-Ereignis des PageControls für jedes nicht sichtbare TabSheet die Controls durch und gebe mittels DestroyHandle die Handles frei.

Delphi-Quellcode:
procedure Set_FreeRessources(ControlFree: TWinControl);
var
  i: integer;
begin
  for i := 0 to ControlFree.ControlCount -1 do
  begin
    if ControlFree.Controls[i].ClassType = TPanel then
      TUserPanel(ControlFree.Controls[i]).DestroyHandle;
    if ControlFree.Controls[i] is TWinControl then
       Set_FreeRessources( ControlFree.Controls[i] as TWinControl);
  end;
end;
Klappt für die User-Ressourcen prima. Kann man was vergleichbares für die GDI-Ressourcen tun?

Viele Grüße Dirk

[edit=Daniel B]Delphi-Tags gesetzt. MfG Daniel B.[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr.

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