IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[C] ScreenShot, fuite de mémoire


Sujet :

Windows

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [C] ScreenShot, fuite de mémoire
    Bonjour à tous...
    Cela fait un bout de temps maintenant que je me débat avec ça. 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 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
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #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);
       
       ReleaseDC(hWndWindow,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;
    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Salut;

    j'y connais pas grand chose dans la lib Windows mais te fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       DeleteObject(hbmp);
       DeleteDC(m_hDcBitmap);
    Est ce qu'elle free avant de detruire ?

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    je ne connais pas la lib, j'ai jeté un rapide coup d'oeil sur le site, mais je pense que le soucis viens de FreeImage_ConvertTo24Bits

    Cette fonction doit allouer une nouvelle structure que tu reaffectes à ta variable dib...

    De plus, un while(1) ... c'est plutôt bazooka ! Pauvre machine.

    Essaie putôt ca :

    [code]

    ....

    FIBITMAP *dib2 = NULL;

    ....

    // conversion 24 (ou 8 Grayscale) obligatoire pour conversion JPEG
    dib2 = FreeImage_ConvertTo24Bits(dib);

    FreeImage_Save(FIF_JPEG, dib2, path, 75);

    FreeImage_Unload(dib);
    FreeImage_Unload(dib2);

    ....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Trés bien vu!!!
    Merci à vous deux. Et particulièrement à vicenzo, l'erreur venait bien de là, j'aurais du y penser...

    Pour résumer si d'autre ont le souci :

    l'erreur vient de cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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érer à l'apel de : Voilà, la solution et d'utiliser un autre pointeur, voir post précédent de vicenzo.
    Merci encore à lui à bientôt.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    tu peux trouver automatiquement les memory leak avec mpatrol
    L'Opus attire les Prélats

Discussions similaires

  1. fuite de mémoire ?
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 16h19
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 10h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo