Toon posts:

[Delphi] Mogelijk memory leak?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb problemen met een delphi database mdi applicatie die ik gemaakt heb.

Het is gemaakt in Delphi 7, maakt gebruik van Interbase en je kan er mee rapporten afdrukken. Het gaat dan om een rapport van bijv 100 pagina's (best veel info staat er op. Per pagina staan er 5 records op en ieder record bestaat uit +- 80 velden). Voor de rapporten maak ik gebruik van Fast Reports.

Het probleem is dat het op mijn pc gewoon perfect werkt, alleen op de pc waar het op moet gaan draaien werkt het juist niet goed (en dan gaat het alleen om het printen. Alle db acties gaan gewoon allemaal goed, echter het gaat niet super snel, maar goed dat kan je ook niet verwachten van zo'n oude pc).

Die pc is wel een zeer ouderwets ding: Pentium 1 233 Mhz met weinig geheugen (windows 98). Maar in princiepe moet zo'n applicatie toch gewoon nog op zo'n pc draaien?

Als ik nu op die oude pc een rapport van 100 pagina's probeer af te drukken, print die wel alle aantal a4'tjes wat die zou moeten doen, echter sommige hebben geen tekst (data) op het blad. Ik maak gebruik van zo'n wit / grijs / wit / grijs , enz... lijn voor elk record in de masterdata en die kloppen wel. Alleen de tekst zit er bij sommige niet bij. Dan een x aantal bladjes verder op zie je op eens weer wel een aantal blaadjes waar de tekst op staat, enz....

(Op mijn pc gaat het voor de duidelijkheid dus wel gewoon goed, geen enkel probleem).

Nu kan het dus mogelijk aan de oude pc liggen, of de laserprinter die gebruikt wordt (is ook niet echt de beste en heeft niet veel geheugen) of een combinatie van de oude pc en printer.

Maar nu ben ik dus aan het kijken of er dus mogelijk geheugen lekken zijn.

Ik maak op mijn pc gebruik van Windows XP. Als ik dan bij Windows taakbeheer kijk, gebruikt het programma direct bij het opstarten al ruim 11 mb zonder verder MDI client schermpjes te openen. Is dat al te veel of is dat gewoon normaal. (De gecompileerde exe is trouwens 5 mb).

Verder wat me op viel is dat wanneer ik een MDI child window open en vervolgens weer afsluit het geheugengebruik in de windows taakbeheer niet terug loopt. Is dat normaal, bijv omdat windows nog wat reserveert voor het programma of zou die weer op het niveau terug moeten komen voordat ik dat mdi child window geopend heb? (en ik geef al het geheugen weer vrij bij het sluiten van de MDI child!)

Kan iemand mij enige tips geven, of is die pc voor zo'n applicatie niet geschikt? (wat ik me bijna niet kan voorstellen).

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Test het eens op een andere winXP en win98 bak. Je weet nooit of DLL's anders zijn op win98 ofzo... Meer test-bakken maakt het makkelijker om problemen te lokaliseren..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
Een andere windows xp bak is ook geen probleem en helaas heb ik geen windows 98 bakken meer hier tot mijn beschikking.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
11 MB vind ik eigenlijk wel veel.
En 5MB voor een exe vind ik ook veel eerlijk gezegd.

Zijn al je forms auto-created in je delphi app? Als je in Delphi, in Project options gaat gaan kijken kan je zien welke forms er al gecreeërd worden bij het opstarten van je applicatie.

Zijn er objecten die je gebruikt in je forms die je zelf moet vrijgeven bij het afsluiten van die form, maar waar je het niet doet?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Het programma bestaat uit +- 50 formulieren, waarvan er 10 automatisch gecreerd worden, de rest maak ik zelf aan wanneer ik ze nodig heb en sluit ze daana weer af.

Alle objecten die ik zelf aanmaak worden ook weer vrijgegeven in het try.. finally blok.


Ik denk dat die exe zo "groot" is door de plaatjes die in de formulieren zitten. Ik heb veel formulieren die aan de linkerkant een jpeg plaatje hebben.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 27 februari 2004 @ 13:40:
Verder wat me op viel is dat wanneer ik een MDI child window open en vervolgens weer afsluit het geheugengebruik in de windows taakbeheer niet terug loopt. Is dat normaal, bijv omdat windows nog wat reserveert voor het programma of zou die weer op het niveau terug moeten komen voordat ik dat mdi child window geopend heb? (en ik geef al het geheugen weer vrij bij het sluiten van de MDI child!)
Windows Taakbeheer geeft geen representatieve gegevens weer wat betreft geheugen gebruik. Zie daarvoor ook dit topic.

Bovendien heeft elk Delphi programma z'n eigen memory manager die niet alles zomaar aan windows teruggeeft, maar het eerst zelf probeert te recyclen.

Ik denk eerder dat je resource lekt of er gewoon teveel van hebt. Win95/98 kunnen er veel minder aan dan WinNT/2000/XP/2003.Teveel schermen en rapporten tegelijk open met teveel componenten erop kan je makkelijk al aan de max bregen. Zorg ervoor dat je zo weinig als mogelijk open houdt. En controleer even met een programmatje of je geen dingen lekt.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 27 februari 2004 @ 14:09:Ik denk eerder dat je resource lekt of er gewoon teveel van hebt. Win95/98 kunnen er veel minder aan dan WinNT/2000/XP/2003.Teveel schermen en rapporten tegelijk open met teveel componenten erop kan je makkelijk al aan de max bregen. Zorg ervoor dat je zo weinig als mogelijk open houdt. En controleer even met een programmatje of je geen dingen lekt.
Ik heb een formulier waarop al mijn rapporten staan. Nu heb ik voor ieder rapport een eigen fast report "report" componentjes en hebben ze allemaal hun eigen dataset componentje.

De rapporten worden bewaard in de DFM file. Het gaat om 21 report componentjes en 26 dataset componetjes (ook van fast report).

Zou dit voor windows 98 al te veel zijn (dit formulier wordt namelijk auto gecreeerd en blijft open gedurende de hele applicatie). Dit is trouwens ook gelijk het enige formulier met zoveel componentjes.

Eventueel kan ik het ook met 1 report componentje gaan doen en dan de rapporten opslaan als aparte bestandjes en die vervolgens laden wanneer die nodig is.


(Het vervelende is vind ik dat ik niet gewoon een foutmelding krijg van te weinig geheugen of geen resources meer.)

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik heb weleens een laserprinter gehad met maar 1MB geheugen. Die drukte gewoon pagina's af met "Geheugen op!!!", met daarvoor de mislukte (halve) pagina.

Hang als test even een matrix/deskjet printer aan die win98 bak, en probeer hoe 't daarmee gaat.

Siditamentis astuentis pactum.


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Verwijderd schreef op 27 februari 2004 @ 15:18:
Zou dit voor windows 98 al te veel zijn (dit formulier wordt namelijk auto gecreeerd en blijft open gedurende de hele applicatie). Dit is trouwens ook gelijk het enige formulier met zoveel componentjes.
Ja, daar moet je heel erg mee uitkijken, want windows 9X heeft een limiet op het GDI-geheugen. Bij NT-versies is dit ongelimiteerd.

Applicaties met flink veel knopjes, labels, etcetera vreten flinke gedeelten van het GDI-geheugen. Maar als dit geheugen op raakt krijg je vanzelf 'enge' meldingen. 'A winapi function failed', witte error-schermpjes (huuu.. die zijn eng!) en dat soort dingen.

Siditamentis astuentis pactum.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 27-05 15:56

Tomatoman

Fulltime prutser

Kun je als test geen virtuele printer installeren die de printoutput naar een bestand stuurt in plaats van naar de printer? Dan kun je kijken of de gegevens netjes in het printbestand terecht komen. Zo ja, dan heeft je programma een probleem. Zo nee, dan is de printer niet tegen zijn taak opgewassen.

Een goede grap mag vrienden kosten.

Pagina: 1