![]() |
Es stehen nicht genügend Resourcen.....
Was soll ich davon halten:
'Es stehen nicht genügend Resourcen im System zur Verfügung, um die Operation auszuführen. Schließen Sie einige Fenster und versuchen es erneut.' Es handelt sich um ein Programm, das XML Dateien verwaltet. Programmgrösse : 58 MB, maximal 400 KB XML Dateien geleichzeitig geöffnet, maximal 3 Formulare gleichzeitig geöffnet. Vor allem : welche Operation? Das kommt teilweise ohne irgendeine Aktion meinerseits. Anders: was muss ich da suchen? Was kann das sein? Ich bin ratlos. creehawk P.S. es laufen keine anderen Programme. |
AW: Es stehen nicht genügend Resourcen.....
Die Fehlermeldung ist leider meist schlicht daneben, sie zeigt nur, das eine GDI-Funktion (meist irgend eine Operation mit einem TCanvas) fehlgeschlagen ist.
Kannst Du das im Debugger reproduzieren? Arbeitet das Programm eventuell in einem Hintergrundthread mit einem TCanvas, z. B. dem einer TBitmap? Dann nicht vergessen, die Zeichnenoperationen in Canvas.Lock/Unlock "Klammern" einzuschließen, mit einem try finally Block. |
AW: Es stehen nicht genügend Resourcen.....
Hallo,
ich würde mal FastMM4 "anwerfen". Könnte ein Speicherleck sein. |
AW: Es stehen nicht genügend Resourcen.....
Es gibt glaube ich auch andere Tools die Ressourcen Lecks wie GDI Handels erkennen können...
|
AW: Es stehen nicht genügend Resourcen.....
Moin Moin.
Speicherlecks habe ich mit 2 Tools gesucht, nix zu finden. Im Programm werden einige Bitmaps/PNG/DDS verarbeitet, insbesondere an einer Stelle : umwandeln einer Bitmap in Base64 für XML Speicherung. Ich werfe das mal raus, mal sehen. creehawk |
AW: Es stehen nicht genügend Resourcen.....
Man sieht im Process Explorer die Anzahl der GDI-Handles, so als ersten Schritt.
|
AW: Es stehen nicht genügend Resourcen.....
Der normale Windows Taskmanager kann GDI-Objekte, Handles, Threads, Speicher und vieles mehr anzeigen.
Kannst du das Problem denn halbwegs reproduzieren? Das allein wäre schon sehr viel wert. |
AW: Es stehen nicht genügend Resourcen.....
Das reproduzieren des Fehlers ist das Problem, dann hätte man ja einen Ansatz. Aber die Messagebox kommt einfach irgendwann - drei Minuten nach dem Start, zwanzig Minuten nach dem Start.
Wir haben hier mehrere Rechner unterschiedlicher Ausstattung. Bei manchen passiert nie was (83%), beim anderen andauernd (7%), beim wieder anderen gelegentlich(10%). Insgesamt 24 Rechner. Das angeforderte 'Fenster schliessen' bringt nichts, oft wird nur das Hauptformular angezeigt. Zudem : Beenden kann ich das nur alles mit dem Taskmanager und Task beenden. In der Messagebox wird als Überschrift der Programmname genannt, deshalb gehe ich davon aus an das kommt eben aus dem Programm. Es werden keine Fremdprogramme aufgerufen, DLLs oder ähnliches verwendet. Jetz werden wir mal den Taskmanager befragen über Handles und das ganze Zeug. Wenn die Meldung kommt müsste ja was zu finden sein. creehawk P.S. die Base64 habe ich rausgeworfen, Canvas Aktionen habe ich keine drin. |
AW: Es stehen nicht genügend Resourcen.....
Schau doch noch im Windows-Event-Viewer nach, ich wette da stehen auch mehr Informationen (welcher Prozess, evtl. sogar Adresse aus dem Stack)
|
AW: Es stehen nicht genügend Resourcen.....
Ja poste mal den Quelltext, mindestens vom Erstellen der Bitmap bis zum Freigeben.
Wenn GDI überlastet ist, fehlen oft Teile von Fenstern. |
AW: Es stehen nicht genügend Resourcen.....
Gefunden. Hoffentlich. Jedenfalls ist der Fehler die letzten 90 Minuten auf mehreren Rechnern nicht mehr aufgetaucht.
Um eine Bitmap umzuwandeln in Base64 verwenden wir IdEncoderMIME (Indy). Schön. Allerdings fehlte in der Funktion eine Kleinigkeit. ALT:
Delphi-Quellcode:
NEU:
function CreateBase64String(FileName: String): String;
var FS: TFileStream; begin FS := TFileStream.Create(FileName, fmOpenRead); try Result := TIdEncoderMIME.EncodeStream(FS); finally end; end;
Delphi-Quellcode:
Gesehen? Da habe ich auch mehrfach drüber weggelesen.
function CreateBase64String(FileName: String): String;
var FS: TFileStream; begin FS := TFileStream.Create(FileName, fmOpenRead); try Result := TIdEncoderMIME.EncodeStream(FS); finally FS.Free; end; end; Na, vielen Dank für die Hinweise, ich hoffe das war es. Wenn nicht..... creehawk |
AW: Es stehen nicht genügend Resourcen.....
Dann würde ich aber sagen dass deine zwei Tools die du verwendet hast nicht gut sind:
Zitat:
|
AW: Es stehen nicht genügend Resourcen.....
Warum braucht man eigentlich Tools dafür?
![]() |
AW: Es stehen nicht genügend Resourcen.....
Ja mit den Bordmittel und ReportMemoryLeaksOnShutdown=True habe ich bisher immer alle Memoryleaks gefunden. Da braucht es keine zusätzlichen Tools. Das hätte auch in diesem Fall zu 100% eine grosse Anzahl nicht freigegebener TFileStreams gemeldet.
|
AW: Es stehen nicht genügend Resourcen.....
Zitat:
![]() Verwende immer ReportMemoryLeaksOnShutdown trotzdem wurde in einen meiner Projekte nicht erkannt das ein Handle nicht freigegeben wurde. Ich konnte aber erkennen das im Task Manager sich die Handles summierten. |
AW: Es stehen nicht genügend Resourcen.....
Ja aber das hat nichts mit Memoryleaks zu tun. Für solche Sachen wie Handles, braucht man schon etwas anderes. Das ist nicht Aufgabe des Memorymanagers.
|
AW: Es stehen nicht genügend Resourcen.....
Moin Moin!
Wie ich oben geschrieben habe passiert jetzt nichts mehr. Ob das jetzt ein MemoryLeak war weiß ich nicht. @redemeer's Hinweis auf ReportMemoryLeaksOnShutdown haben wir natürlich auch verwendet - nix. Als wir allerdings die Base64 Kiste wieder aktiviert haben : nach einer Weile tauchte die Meldung dann wieder auf. Nun haben wir eine Timerfunktion am laufen, die regelmäßig eine Prüfung vornimmt. Base64 dringelassen, Timer rausgenommen. Jetzt kommt die Meldung auch nicht mehr.
Delphi-Quellcode:
Aber was das jetzt mit der Meldung zu tun hat? Mit Base64 hat das allerdings nix zu tun, sind PNG Grafiken.
if TDirectory.exists(ModPath + '[ShipEdit] Segelweberei Enbesa') = true then
begin ShipYardForm03.SailClothingEnbesaImage.Picture.Graphic := MainForm.ImageCollection.GetScaledImage(MainForm.ImageCollection.GetIndexByName('ja'),48,48); end else begin ShipYardForm03.SailClothingEnbesaImage.Picture.Graphic := MainForm.ImageCollection.GetScaledImage(MainForm.ImageCollection.GetIndexByName('nein'),48,48); end; Kurios. creehawk |
AW: Es stehen nicht genügend Resourcen.....
Moin...8-)
[Klugscheiß ON]
Delphi-Quellcode:
..niemals auf True prüfen. :warn:
if TDirectory.exists(ModPath + '[ShipEdit] Segelweberei Enbesa') = true then
Delphi-Quellcode:
...
if TDirectory.exists(ModPath + '[ShipEdit] Segelweberei Enbesa') then
[Klugscheiß OFF] :zwinker: |
AW: Es stehen nicht genügend Resourcen.....
Du hast die Freigabe der skalierten Grafik vergessen.
Wenn ReportMemoryLeaksOnShutdown in deiner Anwendung auf True gesetzt ist, wird dieser Speicherfehler beim Beenden der Anwendung auf jeden Fall gemeldet.
Delphi-Quellcode:
var
sImage: string; lImage: TWICImage; begin if TDirectory.exists(ModPath + '[ShipEdit] Segelweberei Enbesa') then sImage := 'ja' else sImage := 'nein'; {gibt ein Image der Collection zurück, für die Freigabe ist die Collection verantwortlich} lImage := MainForm.ImageCollection.GetIndexByName(sImage); {erzeugt ein neues Image der gewünschten Größe, für die Freigabe ist man selbst verantwortlich!} lImage := MainForm.ImageCollection.GetScaledImage(lImage, 48, 48); try {ezeugt intern eine Kopie des Image per Assign()} ShipYardForm03.SailClothingEnbesaImage.Picture.Graphic := lImage; fianlly lImage.Free; end; |
AW: Es stehen nicht genügend Resourcen.....
@haentschman
Okay. Wo finde ich die Erklärung warum nicht? Für mich war des jetzt logisch so abzufragen. Und das mache ich anderweitig auch. Gilt das für alle Elemente? @Blup Okay, wusste ich jetzt so nicht.... Danke, wird getestet. creehawk |
AW: Es stehen nicht genügend Resourcen.....
Hallöle...8-)
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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-2025 by Thomas Breitkreuz