Purge de la mémoire

cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013 - 14 janv. 2007 à 18:36
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013 - 17 janv. 2007 à 19:42
Bonjour,
Je travaille sur une grosse application graphique qui exécute sur un PictureBox d'énormes quantités de tracés (lignes, polygones, polylines, images, textes droits et obliques, aplats de couleurs,...) le tout avec des zooms fréquents.
Au bout d'une certaine période, j'observe une certaine instabilité de l'affichage voire de l'appli elle-même.
Je cherche un moyen efficace pour purger la mémoire principale et la mémoire graphique.
Je ne suis pas sûr que cela soit possible...
Merci pour un coup de main!

<!-- / message -->

17 réponses

Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
14 janv. 2007 à 19:02
Salut,

Tout dépend comment tu a construit ton appli.
Un exemple, si tu crées des objets dans le genre :
Set MonObjet = New ....
pense toujours à libérer la mémoire quand tu n'as plus besoin de cet objet avec un :
Set MonObjet = Nothing

Pour les pictureboxes, il faut penser aussi à les vider avec un :
MaPicture = LoadPicture()

Etc...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 janv. 2007 à 19:02
Lol, dit comme cà c'est sûr qu'on va pas pouvoir faire grand chose !

Une bonne conduite à garder : à chaque objet créer, le détruire !

Donc si tu utilise des pinceaux ou des crayons de l'api Windows par exemple, je jamais oublier de faire des DeleteObjects dessus dès que tu n'en as plus besoin, sinon c'est sûr que tu va encombrer très vite la mémoire pour rien !
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
14 janv. 2007 à 19:03
Oups,
MaPicture.Picture = LoadPicture()
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 janv. 2007 à 19:06
dolphin boy : comme je l'ai déjà dit aujourd'hui sur un autre poste : évitez de faire des loadpicture() pour vider un picturebox !!! Préférez un Set Picture1.Picture = Nothing
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 janv. 2007 à 19:25
Qu'il pense également à vider le presse-papier, chaque fois que ce qu'il contient n'est plus nécessaire. Je dis celà car, comme il ne s'agit pas là d'une création d'objet, cet objet-là est souvent oublié dans son coin.
Pour les objets créés : + 1 avec ce qu'a exprimé DarkSidious.


Mais même en faisant tout celà, des lenteurs demeureuront. Elles sont dûes à une gestion imparfaite de la mémoire par Windows.


Il m'est ainsi fréquemment arrivé de constater (en dépit de toutes les précautions citées plus haut) le phénomène suivant :


1) chargement d'une petite image : temps de chargement = durée1


2) vidage de l'image (par = nothing)


3) chargement d'une très grosse image : temps de chargement = durée2


4) vidage de l'image (par = nothing)

5) chargement, à nouveau de la toute 1ère petite image : temps de chargement constaté durée3 > durée1 !

Je n'ai jamais réussi à palier cette difficulté là (et j'ai longuement cherché à le faire, il y a 5 ans).
Il semble pourtant que l'on puisse le faire puisque j'avais à l'époque trouvé un petit outil (dont j'ai oublié le nom) qui permettait d'optimiser, à la demande, la mémoire disponible.
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
14 janv. 2007 à 19:41
Le plus gros des dessins est réalisé par Polygon() ou Polyline() , fonctions du Gdi et, naturellement, il n'est pas question à l'issue du tracé de faire un LoadPicture() ni un Set Picture = nothing, j'aimerais plutôt faire une espèce de DeleteGraphics() tel que cette fonction existe dans GDI+
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 janv. 2007 à 19:49
Les fonctions que tu dénommes ici ne sont pas en elles-mêmes gourmandes en mémoire. Il te faut toutefois penser à zigouiller les éventuels RECT, etc... que tu aurais pu créer... dès le dessin fait (et après chaque dessin).

Si tes tracés sont faits sur une seule picturebox, ce seront les dimensions en pixels de cette picturebox qui détermineront le grignotage de ta mémoire. A multiplier, bien sur, par le nombre de pictureboxes si tu dessines dans des pictureboxes séparées...

Evite surtout de dessiner dans plusieurs pictureboxes si, au bout du compte, tu dois les insérer dans une seule ! Dessine directement là où il faut dans ta picturebox...

Enfin... je ne connais pas ton projet, alors... je ne sais pas...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 janv. 2007 à 19:55
Polygone ou polyline utilise des crayons, donc vérifie bien qu'à chaque createPen tu as un DeleteObject associé !
Idem, n'oublie pas de récupèrer le handle retournée par SelectObject afin de le remettre dans le hDC une fois le crayon utilisé !
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
14 janv. 2007 à 20:45
Je n'utilise ni pen ni brush mais plutôt les propriétés ForeColor, FillStyle et FillColor; peut-être n'est-ce pas très malin?
Par ailleurs, je fais un grande quantité de dessins hors écran et j'ai remarqué que l'instabilité citée plus haut croissait en fonction du volume de ces tracés.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 janv. 2007 à 21:15
Jacques13...
l'autre Jacques (bibi) te demande de bien vouloir exposer simplement la situation :

Combien de Poctureboxes as-tu ?
Comment t'en sers-tu ?
Et, si tu en as plusieurs : combien et pourquoi ...


Enfin : que sont ces "dessins hors ecran", en fait ? soit précis ...
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
14 janv. 2007 à 21:46
Je travaille avec une seule PictureBox sur laquelle je dessine un plan. Naturellement, le plan dessiné déborde généralement de la PictureBox bien que j'essaye dans la mesure du possible de limiter les objets tracés.
Suis-je assez précis, Jacques?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 janv. 2007 à 21:58
Oui, c'est maintenant clair.3

Dans de telles conditions, la consommation de mémoire sera essentiellement celle occasionnée par les dimensions (affichées ou non, de ta pictureBox, tout le reste n'étant que quantité négligeable, surtout si tu détruis les objets créés au fur et à mesure.

Cette consommation est normalement totalement indépendante du nombre de tracés sur ta picturebox ! Elle est proportionnelle au nombre de pixels (largeur X hauteur) et ne devrait donc pas varier au fur et à mesure de tes tracés !
Je ne suis plus, là, Jacques... Y aurait-il autre chose que tu n'aurais pas encore dit ?
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
14 janv. 2007 à 22:50
Jacques, j'en reviens à ma question initiale et primordiale, y aurait-il un moyen de purger ou de libérer la mémoire entre chaque affichage?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 janv. 2007 à 08:04
Bonjour,

Aucun autre (que je maitrise, comme je te l'ai dit plus haut) que ceux qui t'ont été signalés...
Or, tu dis les appliquer déjà.
Et tu nous dis par ailleurs n'avoir qu'une picturebox (de très grandes dimensions). Celle-ci mobilise la mémoire de façon proportionnelle au nombre de ses pixels. Quand on change l'image de cette picturebox, y compris si l'on prend la précaution de faire précéder ce changement par un picture1.picture = Nothing, Windows semble avoir des difficultés à libérer totalement sa mémoire de l'image concernée (relire la relation que j'ai faite plus haut de certaines constatations).

Elle est si énorme que celà, ta pictureBox ?
Es-tu certain de ce que, pour de simples tracés, tu ne pourrais pas te contenter de moins gourmand ?
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
15 janv. 2007 à 18:34
En fait, la PictureBox se dimensionne selon la totalité de l'écran moins 2 petites marges sur les cotés, un bandeau de menu graphique sur le haut et un bandeau d'info sur le bas. Pas question de la réduire car tous l'espace disponible est nécessaire.
L'appli fonctionne parfaitement avec les plans de petite et moyenne dimension; les choses se gâtent avec plans très grands, comme si la mémoire système n'arrivait plus à gérer cette masse d'information.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 janv. 2007 à 08:26
Juste pour y voir clair :
Peux-tu nous dire comment (par quel mécanisme et, le cas échéant, par quel tremplin) tu redimensionnes ta picturebox ?

La définition précise de ce mécanisme sera peut-être révélatrice de la raison des problèmes rencontrés.
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
17 janv. 2007 à 19:42
Au lancement de l'appli, je la dimensionne en fonction de la taille de l'écran; ensuite je n'y touche plus.
0
Rejoignez-nous