![]() |
Systemressourcen erschöpft
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,
ich habe eine komplexe Anwendung geschrieben ( ![]() Im Moment gebe ich damit testweise ältere umfangreiche Turnierdaten eines großen Mannschaftsturniers ein und erhalte neuerdings immer wieder die Meldung "Systemressourcen erschöpft". Kann mir jemand bei einem Lösungsansatz helfen? Im Moment habe ich noch keine wirkliche Idee woran das liegen kann :-( Die Anzahl der Handels schwankt immer etwas und war auch schon höher als zum Zeitpunkt der Fehlermeldung. Evtl. hat das Problem auch mit einer Speicherfunktion auf die Festplatte zu tun... Anbei zwei Screenshots des Systemmonitors. Kann mir jemand einen Tip geben? Muss ich erzeugte Komponenten auf verdeckten Registerseiten oder nicht benötigte Formulare gleich wieder auflösen? Danke Stahli |
Re: Systemressourcen erschöpft
Gibst du auchnicht mehr bentugte Objekte auch wieder frei? Dies gilt auf für GDI Ressourcen.
|
Re: Systemressourcen erschöpft
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm, das kann ich schwer beantworten...
Ein Turnierprojekt ist so etwas ähnliches wie eine DFM. Die TUR-Datei wird geladen und die (massenweise) enthaltenen Datenkomponenten werden erzeugt und geladen. Dann gibt es verschiedene sichtbare Komponenten, z.B. Designer und Listen, denen die Datenkomponenten zugewiesen werden. Diese erzeugen dann eine passende Anzahl sichbarer Komponenten, die die Daten anzeigen (siehe z.B. Spielerlisten im Bild). Werden die Daten aufgelöst, werden auch "automatisch" die sichtbaren Komponenten entfernt. Das findet aber nicht statt, solange ich nur ein anderes Register oder Unterformular auswähle. Wenn die Anzahl der gleichzeitig erzeugten Komponenten das Problem sein sollt könnte ich vielleicht wenigstens nicht gebrauchte Unterformulare auflösen oder Inhalte von ausgeblendeten Registern löschen... Aber erst einmal würde ich gern genau wissen, wo das Problem genau steckt und wie ich eine "drohende Ressourcenüberschreitung" vielleicht vorher erkennen kann... -> "Bitte schnell alles speichern, gleich knallts!" - oder so :-( Und GDI-Ressourcen kann ich im Moment noch nicht recht einordnen. Ach so, jeder Spieler verwaltet aicuh noch ein Bitmap. Dannke schon mal! |
Re: Systemressourcen erschöpft
Zitat:
Hast Du schon mal FastMM (oder ähnliche Speicher-Profiler) mitlaufen lassen? Anhand deren Log kann man recht gut herausfinden, wo was nicht freigegeben wird. |
Re: Systemressourcen erschöpft
Nein, da habe ich mich noch nicht heran getraut.
Aber da muss ich dann wohl mal durch und sehen, ob ich damit zurecht komme... |
Re: Systemressourcen erschöpft
Zitat:
Mfg Net7 |
Re: Systemressourcen erschöpft
Zitat:
Delphi-Quellcode:
Falls eine große Zahl nicht freigegebener Objekte angezeigt wird, kann man anhand der angezeigten Klassennamen versuchen, die Ursachen zu finden. Für detailliertere Fehlerprotokolle kann man FastMM4 direkt einbinden und die Codestellen automatisch auflisten lassen, an denen Objekte erzeugt wurden, die nicht freigegeben werden.
{$WARN SYMBOL_PLATFORM OFF}
ReportMemoryLeaksOnShutDown := DebugHook <> 0; {$WARN SYMBOL_PLATFORM ON} |
Re: Systemressourcen erschöpft
Liste der Anhänge anzeigen (Anzahl: 1)
@Net7:
Die Daten sind vorwiegend als Eigenschaften in Objekten enthalten. @mjustin: Danke! D2006 bringt da ja schon einen eigenen Ansatz mit (siehe Bild). Ich hätte nicht gedacht, dass mein Problem doch selbst gemacht ist - muss erst mal aufräumen! Zumindest ist ein Lösung in Aussicht :-) Verstehe ich das richtig, dass FastMM oder EurekaLog dann darüber hinaus "nur" helfen, die Stelle im Quelltext leichter zu finden? Danke schon mal für die GRO?E Hilfe! Stahli |
Re: Systemressourcen erschöpft
Systemressourcen sind aber kein Speicher (im MemoryManager),
aber die ganzen GDI-Objecte, welche z.B. in einem TBitMap gekapselt sind schon. Wobei ~780 Bilder doch eigentlich nicht viel sind (dürften doch nicht viel mehr als 800 bis 4000 GDI-Objecte drin stecken :gruebel: und ich dachte soviel bekommt windows noch locker hin) |
Re: Systemressourcen erschöpft
Zitat:
Zitat:
Aber das siehst du ja vielleicht auch selbst bei dir. Entscheidend könnte z.B. sein, wenn du TBitmap castest um es irgendwo als Pointer zu speichern. Denn dabei geht ggf. der Referenzzähler flöten und es wird nicht mehr aufgeräumt. Das wären neben den Standardfehlern weitere Fallstricke. // EDIT: Zitat:
|
Re: Systemressourcen erschöpft
keine Sorge ... TBitMap ist ein Object und die haben ja keine Referenzzählung (wobei man diese als Objekte auch eigentlich nicht nach Pointer casten muß, um sie irgendwo abzuspeichern/abzulegen)
|
Re: Systemressourcen erschöpft
Zitat:
Ich hatte irgendwie gerade Strings im Hinterkopf als ich das geschrieben habe. :gruebel: |
Re: Systemressourcen erschöpft
Ich habe den Übeltäter :-)
Delphi-Quellcode:
Um Bilder "zu löschen" habe löse ich das Bitmap auf und erzeuge ein neues (Bitmap.Clear gibt es ja nicht).
procedure TDPerson.ClearPicture;
begin if Assigned(FPicture) then // neu eingeführt begin FreeAndNil(FPicture); FPicture := TBitmap.Create; DataChanged; end; end; Diese Methode wurde auch aufgerufen bevor das Bitmap das erste mal erzeugt wurde :oops: Jetzt schließe ich das mit Assigned aus. Das Hauptproblem scheint geklärt :-) Danke für die Hilfe! Stahli |
Re: Systemressourcen erschöpft
Wen du so vile Unterformulare hast, würde ich die auch nicht beim Programmstart alle automatisch erzeugen lassen, sondern zur Laufzeit dynamisch erzeugen.
|
Re: Systemressourcen erschöpft
Ja, das mache ich auch.
Ich löse sie dann allerdings nicht wieder auf, da sie immer mal wieder gebraucht werden. Für den Notfall merke ich mir das als Option vor. Nach Klärung des Bitmap-Problems läuft allerdings nun alles perfekt! :-) |
Re: Systemressourcen erschöpft
Zitat:
|
Re: Systemressourcen erschöpft
Kurz zu meinem Konzept dazu:
Die Unterformulare diesen der Datenbearbeitung von Komponenten. VCustom.FormEdit Die Methode VCustom.Select öffnet weist der Eigenschaft je nach Situation ein Bearbeitungsformular zu, positioniert und öffnet dieses. Wurde das betreffende Bearbeitungsformular bisher noch nicht benutzt wird es erzeugt (Eigentümer ist die Application). Das Formular schließt sich i.d.R. automatisch, wenn es deaktiviert wird. Aufgelöst wird es, wenn die Application beendet wird. Die Unterformulare werden imnmer wieder benötigt, daher löse ich sie nicht sofort auf und das führt ja (offenbar) auch nicht zu Problemen... |
Re: Systemressourcen erschöpft
Zitat:
|
Re: Systemressourcen erschöpft
Also ich habe jetzt FastMM4 installiert und nutze den FullDebugMode.
So habe ich noch einige weitere Fehler gefunden, bei denen ich über Referenzen auf bereits aufgelöste Objekte deren Methoden aufgerufen habe. Das habe ich vorher gar nicht bemerkt! Es ist zwar (auch mit dem Textreport) nicht einfach, die betreffenden Fehler aufzuspüren, aber man erhält ein paar gute Anhaltspunkte. Es ist also bei komplexeren Programmen wohl unbedingt sinnvoll, FastMM oder Ähnliches zu verwenden. Wäre natürlich auch nicht verkehrt, wenn Delphi so eine Speicherkontrolle selbst durchführen würde. Welche Alternativen gibt es zu FastMM. Was sind die Vor- und Nachteile? Stahli |
Re: Systemressourcen erschöpft
Zitat:
Zitat:
|
Re: Systemressourcen erschöpft
Zitat:
![]() Duech die genauen Hinweise zu den damit erreichbaren Optionen (und deren Abhängigkeiten) kann man bei der Analyse noch einiges mehr erreichen. Wäre nett, wenn so etwas auch in Delphi integriert wäre. Zum Beispiel als Experte :zwinker: ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
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