begin process at 2012 05 30 17:06:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Multimédia

 > 

ScreenShot, fuite de mémoire (FreeImage)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

ScreenShot, fuite de mémoire (FreeImage)

mercredi 21 novembre 2007 à 05:05:17 | ScreenShot, fuite de mémoire (FreeImage)

ssmint

Bonsoir, ou bonjour à tous...
Cette nuit, un problème m'empêche de trouver le sommeil. Il s'agit d'un petit bout de code destiné à prendre un screenshot et à l'enregistrer au format jpg sur le disque grace à la lib FreeImage.
Le code fonctionne trés bien (il vient d'ailleur d'une source du site) mais pour les besoins de mon programme je dois boucler l'opération indéfiniment. Et là aprés 10 secondes de while(1), le programme gonfle en ram pour arriver à dépasser le Go et finir par occuper toute la mémoire... Je libère pourtant la mémoire au niveau des HDC, HBITMAP et variables FreeImage mais le problème persiste.
Je ne connais pas bien le principe des DC win32, etc.. C'est sans doute une erreur bête, mais je ne vois pas...
Si vous voulez jeter un oeil au vilain code...
merci d'avance.

PS : pour transformer un HBITMAP en variable FreeImage (FIBITMAP), je me suis servi de cet exemple que j'ai épurer (peut être trop!) 
http://freeimage.sourceforge.net/faq.html

#include <windows.h>
#include "FreeImage.h"

void takeScreenShot(const char *path)
{               
   // Récupération des dimensions du bureau :
   int ScreenX = GetSystemMetrics(SM_CXSCREEN);
   int  ScreenY = GetSystemMetrics(SM_CYSCREEN);
     
   // Récupération du HWND et du HDC du bureau :
   HWND hWndWindow = GetDesktopWindow();
   HDC hDcWindow = GetWindowDC(hWndWindow);
     
   // Récupération du nombre de couleurs :
   int nColors = GetDeviceCaps(hDcWindow, BITSPIXEL);
  
   // Création d'un contexte mémoire
   HDC  m_hDcBitmap = CreateCompatibleDC(hDcWindow);
  
   // On crée un bitmap en mémoire ayant les dimensions du bureau
   HBITMAP hbmp = CreateCompatibleBitmap(hDcWindow, ScreenX, ScreenY);
  
   // On sélectionne ce bitmap dans le contexte mémoire :
   SelectObject(m_hDcBitmap, hbmp);
  
   // copie du contexte écran vers le contexte mémoire :
   BitBlt(m_hDcBitmap, 0, 0, ScreenX, ScreenY, hDcWindow, 0, 0, SRCCOPY);
  
   DeleteDC(hDcWindow);

  
// Initialisation du FIBITMAP :

FreeImage_Initialise(true); 
                 
FIBITMAP *dib = FreeImage_Allocate(ScreenX, ScreenY, nColors);

  
   // Copie du Hbitmap dans FIBITMAP : 
 
  GetDIBits(m_hDcBitmap, hbmp, 0, ScreenY ,FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);

   DeleteObject(hbmp);
   DeleteDC(m_hDcBitmap);

  
   // conversion 24 (ou 8 Grayscale) obligatoire pour conversion JPEG
   dib = FreeImage_ConvertTo24Bits(dib);
  
   FreeImage_Save(FIF_JPEG, dib, path, 75);
  
   FreeImage_Unload(dib);
   FreeImage_DeInitialise();  
}

int main()
{
  while (1)takeScreenShot("test.jpg");
  return 0;
}

mercredi 21 novembre 2007 à 05:19:40 | Re : ScreenShot, fuite de mémoire (FreeImage)

SAKingdom

Membre Club
Ce n'est peut-être pas la source du problème mais ce n'est pas DeleteDC que l'on appel suite à un GetWindowDC. C'est ReleaseDC.

C++ (@++)

mercredi 21 novembre 2007 à 13:48:49 | Re : ScreenShot, fuite de mémoire (FreeImage)

ssmint

Merci de ta contribution mais ce n'est malheureusement pas ça :
j'ai remplacé
DeleteDC(hDcWindow) par ReleaseDC(hWndWindow,hDcWindow )  mais le problème persiste.

mercredi 21 novembre 2007 à 18:06:29 | Re : ScreenShot, fuite de mémoire (FreeImage)

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Tu peux essayer de mettre en commentaire des bouts de codes pour cerner le problème.

Tu peux aussi essayer de modifier ton code de manière à n'effectuer des allocation qu'au lancement du programme. Pas la peine de tout recréer à chaque fois... sauf si tu veux gérer les changement de résolution de l'écran / et ou les couleurs. Mais à ce moment là, il serait plus judicieux de tout réallouer si et seulement si la configuration de l'écran à changé.

M'enfin il serait préférable de régler ce problème de fuite avant de changer la structure de ton appli.

3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
jeudi 22 novembre 2007 à 22:05:42 | Re : ScreenShot, fuite de mémoire (FreeImage)

victorcoasne

Membre Club
Bonjour,

Essaye de le lancer en mode débug.
Sous Dev-C++ il te dit la ligne où il a planté.

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
vendredi 23 novembre 2007 à 12:00:54 | Re : ScreenShot, fuite de mémoire (FreeImage)

ssmint

Réponse acceptée !
Merci à tous pour vos réponses, j'ai fini par trouver l'erreur, elle vient de la ligne:

dib = FreeImage_ConvertTo24Bits(dib);

En fait FreeImage alloue un nouvel espace memoire pour l'image pointée par dib converti en 24bits. Vu que j'assigne le pointeur dib à cette dernière, l'ancien espace mémoire contenant l'image non convertie se retrouve sans rien pointant dessus et n'est donc pas libéré à l'apel de : FreeImage_Unload(dib);

Merci encore à bientôt.


Cette discussion est classée dans : mémoire, freeimage, dib, hdcwindow, screeny


Répondre à ce message

Sujets en rapport avec ce message

La librairie FreeImage [ par Alexbad ] Salut,J'ai commencé à programmer en C++ avec la librairie standard de Windows. Là, je réussis à ouvrir une jolie fenêtre grisonnante au centre de l'éc bitmap et freeImage [ par valerymb ] bonjour à tous,je souhaiterais à partir d'un bitmapInfo obtenir une FIBITMAP (qui est utilisée par les fonctions de la librairie freeimage). Le souci Bitmap 256 couleur [ par SMarmotte ] Bonjour à tous,Je cherche désespérement à faire un bitmap en mémoire de 256 couleurs que l'on peut enregistrer dans un fichier .bmp.J'ai créé une sect pointeur-mémoire [ par baby3378 ] bonjours à tous,Voila j'ai voulu créé un programme qui peut acceder à la mémoire grace aux pointuer, je m'explique:_un pointeur se place sur une adres limiter la mémoire [ par mnaulet ] Bonjour,Est-il possible de limiter les ressources mémoire utilisées pour un programme à 5Mo par exemple (sous windows, en c/c++ sous visual studio, vo Gestion de la mémoire [ par DMK04 ] Salut,Je me demandais un truc sur la gestion de la mémoire. Je ne vois pas trop comment l'expliquer simplement et rapidement, voici donc un peu de cod augmentation de la mémoire utilisée [ par mrous ] Bonjour,pour les besoins d'une application, je dois réaliser un tableau composé d'un million de variables et pouvant utiliser jusqu'a 16 Mo de RAM. Pe pointeurs et structures [ par glipper ] Bonjour,j'ai declaré dans un de mes programmes une structure dans un fichier header :typedef struct Fiche{    char iop[30];} Fiche;<b analyseur code pour dépassement mémoire [ par adrienj ] Bonjour à tous,j'utilise Splint pour analyser mon code C et je souhaite que le résultat de l'analyse me dise les failles de gestion mémoire du genre ( API Hooking & accés mémoire [ par simtiers ] Salut !Voilà, j'essaie de faire un API Hooking sur Virtual PC pour le rendre transportable sur une clé USB.Le but est en fait de traiter tous ses appe


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,622 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales