Capture d'écran et fuite mémoire

Résolu
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 - 6 juin 2006 à 18:04
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 - 6 juin 2006 à 18:13
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

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
6 juin 2006 à 18:13
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 :)
3
Rejoignez-nous