Capture d'écran et fuite mémoire [Résolu]

Signaler
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
-
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
-
J'utilise un morceau de code assez "banal" pour effectuer une capture d'écran. Cependant, dans mon projet, j'effectue de nombreuses captures d'écran... et je me suis rendu compte que la mémoire montait en flèche. Après "profilage", il semblerai que c'est le code effectuant la capture d'écran qui ne libèrerait pas toutes les ressources, provoquant la fuite mémoire.

J'ai fait le test en appelant ce code toutes les secondes, et ca grimpe vraiment vite. J'ai testé aussi en forçant le garbage collector toutes les 5 secondes, mais ça ne change rien du tout. La mémoire reviens à la normale uniquement lorsque l'appli est quittée.

Y'a quelque chose que je fais mal? ou c'est une fuite "connue" de GDI ? (m'étonnerait quand même...)

Voila le code incriminé :

        private Image image;

        void timer_Tick(object sender, EventArgs e)
        {
            Shoot(User32.GetDesktopWindow());
        }

        private void Shoot(IntPtr handle)
        {
            Graphics gScreen = Graphics.FromHwnd(handle);
            IntPtr hdcScreen = gScreen.GetHdc();
            Bitmap bmpScreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            Graphics gBmp = Graphics.FromImage(bmpScreen);
            IntPtr hdcBmp = gBmp.GetHdc();
            GDI32.BitBlt(hdcBmp, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, hdcScreen, 0, 0, GDI32.SRCCOPY);
            gScreen.ReleaseHdc(hdcScreen);
            gBmp.ReleaseHdc(hdcBmp);
            gScreen.Dispose();
            gBmp.Dispose();
            image = Image.FromHbitmap(bmpScreen.GetHbitmap());
            bmpScreen.Dispose();
        }

Avec :

        [DllImport("gdi32.dll")]
        public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop);

        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();

1 réponse

Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Forcément, c'est en postant ici que je trouve mon erreur...

C'est le "bmpScreen.GetHbitmap()" qui posait problème.
Maintenant ça donne :

            IntPtr hBitmap = bmpScreen.GetHbitmap();
            image = Image.FromHbitmap(hBitmap );
            GDI32.DeleteObject(hBitmap );

et ca marche beaucoup mieux :)