Bonjour,
J'ai réalisé un traitement pour imprimer des images. Les images sont relativement volumineuses et l'espace mémoire occupé par mon programme augmente constamment. Je n'arrive pas à comprendre comment cette fuite mémoire se produit. Elle se produit d'ailleurs de façon aléatoire.
Voici le code permettant de dessiner l'image:
Quand je débugge en pas à pas, je m'aperçois que l'application ne charge pas l'image en mémoire au moment du LoadFromFile, mais au moment du StrechDraw. L'image se charge d'ailleurs 2 fois en mémoire: dans le TPicture et dans le canvas de l'imprimante. Parfois le picture.Free, décharge sa mémoire, parfois pas. Au moment du Printer.NewPage, le canvas de l'imprimante se décharge bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure DessineImage(Imprimante: TPrinter; x1, y1, x2, y2: Integer; str_imagePath: string); var rec_Cadre: TRect; picture: TPicture; begin picture := TPicture.Create; try picture.LoadFromFile(str_imagePath); rec_Cadre.Left := x1; rec_Cadre.Top := y1; rec_Cadre.Right := x2; rec_Cadre.Bottom := y2; Imprimante.Canvas.StretchDraw(rec_Cadre, picture.Graphic); finally picture.Free; end; end;
Résultat: mon programme qui prend 16Mo de mémoire du début du traitement peut en prendre 100 à la fin, et parfois 200, avec les mêmes images.
L'aide la fonction Free du TPicture indique "Détruit un objet et libère si nécessaire la mémoire associée." Que signifie le "si nécessaire"?
Que faut-il faire pour que la mémoire se libère correctement à tous les coups?
---
J'ai oublié de préciser que je travaille avec Delphi 2007.
Je viens de faire un test supplémentaire: faire du TPicture une variable globale et ne jamais faire de free. Le résultat est le même. Après l'impression des images, parfois la mémoire augmente, parfois pas.






Répondre avec citation









on sait déjà que les chiffres s'affolent ! Tant que l'avant-après est correct et que le client ne se plaint pas !

Partager