[R] Capture ecran et mémoire perdue.

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
raoullevert
Niveau 1
Niveau 1
Messages : 6
Enregistré le : lun. 18 mai 2009 14:46
Status : Hors ligne

[R] Capture ecran et mémoire perdue.

#1

Message par raoullevert »

Bonjour a tous,

Déjà un grand bravo au forum. Je découvre auto-it avec joie aux travers des scripts d'exemples et des astuces présentées. Je suis en train de faire un petit programme simple pour l'instant : un "loggeur" pour Entropia Universe. En gros je prends une capture d'écran toutes les secondes, a partir de la je cherche a analyser le Tchat du jeux pour extraire les données texte. C'est plus pour le fun qu'autre chose, car ce genre de logiciel existe apparement.

Bref. Quand je lance mon script, la mémoire augmente au fur et a mesure du temps. Il s'agit d'un simple problème de Release de donnée. Le problème est que quand j'essaye de faire un 'Release' sur l'image de capture, le script s'arrete.
► Afficher le texte
Désolé pour les maladresses de code, c'est mon premier script.
Modifié en dernier par raoullevert le mer. 20 mai 2009 01:24, modifié 6 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Capture ecran et mémoire perdue.

#2

Message par Tlem »

Bonsoir. J'ai survolé extrêmement rapidement votre code et j'ai déjà remarqué deux grosses erreur dans votre code.

Toutes les lignes de commentaire doivent être précédées du symbole ';' (Elle doivent impérativement apparaitre en vert dans Scite).

Ensuite et surement un des problèmes du 'débordement mémoire', c'est que vous utilisez des fonctions _GDIPlus_xxxxx sans les fonctions :
- _GDIPlus_Startup ()
- _GDIPlus_ShutDown ()


Rajoutez les, et sans doute les choses fonctionneront mieux. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
raoullevert
Niveau 1
Niveau 1
Messages : 6
Enregistré le : lun. 18 mai 2009 14:46
Status : Hors ligne

Re: [..] Capture ecran et mémoire perdue.

#3

Message par raoullevert »

Merci pour la réponse rapide !

Pour les commentaires, je les ai rajouté a partir du forum, mais c'est toujours bon de le souligner.
Pour les fonction _GDIPlus_Startup et _GDIPlus_ShutDown, je ne les connaissaient simplement pas !
Je rajoute ça de suite.

EDIT :

En fait ca ne résouds pas le problème. J'ai ajoute les balises Startup et Shutdown autour de mes fonctions GDIPLus, pour la capture, et ca génère le même débordement. Il y a t il un moyen plus simple d'afficher une capture dans un Widget, sans passer par GDIPlus ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Capture ecran et mémoire perdue.

#4

Message par Tlem »

Vous avez ré-édité votre code, ce qui est une bonne chose, mais sur les 20 secondes pendent lesquelles j'ai regardé le code modifié, je note que les commentaire ne sont toujours pas modifiés ainsi l'absence de la fonction _GDIPlus_ShutDown. :shock:

Je ne sais pas si ça fonctionnera mieux, mais je vous conseille de placer la ligne :

Code : Tout sélectionner

$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($Mainwindow)
au début de la fonction ImageCapture() et de rajouter _GDIPlus_ShutDown à la fin de celle-ci.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
raoullevert
Niveau 1
Niveau 1
Messages : 6
Enregistré le : lun. 18 mai 2009 14:46
Status : Hors ligne

Re: [..] Capture ecran et mémoire perdue.

#5

Message par raoullevert »

En fait j'ai placé

Code : Tout sélectionner

$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($Mainwindow)
en début de fonction, et _GDIPlus_ShutDown en fin.
Le résultat est assez surprenant :
Avant le processus qui 'enflait' étais le gestionnaire de fenetres, ce qui est logique : je créais un widget sans le detruire.
Maintenant, l'utilisation de la RAM augmente, mais sans qu'aucune utilisation 'RAM' d'aucun processus n'augmente.
En gros le total augmente sans qu'aucun processus ne 'gonfle' ....
► Afficher le texte
Le problème viendrait de $hBMP. Quand je fais un _GDIPlus_BitmapDispose($hBMP), le script plante. De plus, quand je ne fais pas la conversion Bitmap -> hBitmap, il n'y a pas de fuite mémoire...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Capture ecran et mémoire perdue.

#6

Message par Tlem »

Juste pour info :
La coloration syntaxique du code est réservée aux forums :
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
raoullevert
Niveau 1
Niveau 1
Messages : 6
Enregistré le : lun. 18 mai 2009 14:46
Status : Hors ligne

Re: [..] Capture ecran et mémoire perdue.

#7

Message par raoullevert »

désolé, je le ferais plus :-)
raoullevert
Niveau 1
Niveau 1
Messages : 6
Enregistré le : lun. 18 mai 2009 14:46
Status : Hors ligne

Re: [R] Capture ecran et mémoire perdue.

#8

Message par raoullevert »

Au final j'ai résolu le problème :

_GDIPlus_Shutdown() a été mis dans la procédure fin().
_GDIPlus_Startup () à été mis au tout début du script.

L'erreur ne venait pas de la, mais de la "non-desalocation" de la variable $hBMP.
Pour dire a Windows de libérer la mémoire, il ne fallait pas faire un _GDIPlus_ImageDispose, mais un _WinAPI_DeleteObject ($hBMP).
Tout bêtement.

En tout cas merci du temps passé !
Répondre