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.
Partager