2012-06-06 26 views
6

Mam wątek, który ciągle generuje bitmapy i wykonuje zrzut ekranu okna innego programu. Teraz mam pictureBox w mojej formie i to jest ciągle aktualizowane z wygenerowanymi bitmapami. Oto kod mam w wątku:Ciągłe tworzenie bitmap prowadzi do wycieku pamięci

 Bitmap bitmap = null; 

     while (true) 
     { 
      if (listBoxIndex != -1) 
      { 
       Rectangle rect = windowRects[listBoxIndex]; 
       bitmap = new Bitmap(rect.Width, rect.Height); 
       Graphics g = Graphics.FromImage(bitmap); 
       IntPtr hdc = g.GetHdc(); 
       PrintWindow(windows[listBoxIndex], hdc, 0); 
       pictureBox1.Image = bitmap; 
       g.ReleaseHdc(hdc); 
      } 
     } 

Jak widać, prowadzi to do wycieku pamięci, ze względu na ciągłe wezwanie do nowej bitmapy (rect.Width, rect.Height). Próbowałem dodać "bitmap.Dispose()" na końcu pętli while, ale to prowadzi do zdjęcia obrazu PictureBox również, który sprawia, że ​​gigantyczne czerwone X zamiast rzeczywistego obrazu. Czy istnieje sposób, w jaki mogę zlikwidować "bitmapę" bez pozbycia się obrazu pictureBox?

Odpowiedz

10

Jesteś również "przecieka" obiektu Graphics. Spróbuj tego:

while (true) 
    { 
     if (listBoxIndex != -1) 
     { 
      Rectangle rect = windowRects[listBoxIndex]; 
      Bitmap bitmap = new Bitmap(rect.Width, rect.Height); 
      using (Graphics g = Graphics.FromImage(bitmap)) 
      { 
       IntPtr hdc = g.GetHdc(); 
       try 
       { 
        PrintWindow(windows[listBoxIndex], hdc, 0); 
       } 
       finally 
       { 
        g.ReleaseHdc(hdc); 
       } 
      } 
      if (pictureBox1.Image != null) 
      { 
       pictureBox1.Image.Dispose(); 
      } 
      pictureBox1.Image = bitmap; 
     } 
    } 
+0

No właśnie. Jak słowo kluczowe "przysyp"? Zmodyfikowałem swój kod. Dzięki! – user1440308

+0

"Używanie" bitmapy spowoduje jej usunięcie po przypisaniu jej do 'PictureBox', co powoduje, że bitmapa staje się w pierwszej chwili niedostępna. Musisz zachować bitmapę przy życiu przez cały czas jej wyświetlania na "PictureBox". – Lucero

+0

@ xmenW.K. Co dokładnie nie jest prawdą? 'Image.Dispose()' zwalnia natywny wskaźnik obrazu, możesz sam sprawdzić źródło. – Lucero

1

odpowiedziało na przykład ma wycieku z grafiką g po g.ReleaseHdc(..);

Pamiętaj dipose grafiki zmienne

jak na przykład:

g.Dispose(); 
Powiązane problemy