2012-06-06 8 views
6

की ओर ले जाती है मेरे पास एक धागा है जो लगातार बिटमैप्स उत्पन्न करता है और किसी अन्य प्रोग्राम की विंडो का स्क्रीनशॉट लेता है। अब, मेरे पास एक फॉर्म है जो मेरे फॉर्म पर है, और इसे लगातार बिटमैप के साथ अपडेट किया जा रहा है।बिटमैप्स की निरंतर रचना मेमोरी लीक

 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); 
      } 
     } 

आप देख सकते हैं, इस (rect.Width, rect.Height) नया बिटमैप के लिए निरंतर कॉल के कारण एक स्मृति रिसाव की ओर जाता है, यहाँ कोड मैं सूत्र में पड़ता है। मैंने थोड़ी देर के लूप के नीचे "बिटमैप। डिस्प्ले()" जोड़ने की कोशिश की है, लेकिन यह तस्वीर की ओर जाता है बॉक्स की छवि का भी निपटान किया जा रहा है, जो वास्तविक छवि के स्थान पर एक विशाल लाल एक्स बनाता है। क्या तस्वीर बॉक्स का निपटारा किए बिना मैं "बिटमैप" का निपटान कर सकता हूं?

उत्तर

10

आप ग्राफिक्स ऑब्जेक्ट को "लीक" भी कर रहे हैं। इस प्रयास करें:

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

ओह, यह सही है। उपयोग करने वाले कीवर्ड ने मेरे दिमाग को कैसे फिसल दिया? मैंने अपना कोड संशोधित कर दिया है। धन्यवाद! – user1440308

+0

'बिटमैप' का उपयोग करके इसे 'पिक्चरबॉक्स' में निर्दिष्ट करने के बाद इसका निपटान किया जाएगा, जो कि बिटमैप को पहले स्थान पर पहुंचने का कारण बनता है। आपको 'पिक्चरबॉक्स' पर अपने प्रदर्शन की अवधि के लिए बिटमैप को जिंदा रखने की आवश्यकता है। – Lucero

+0

@ xmenW.K। वास्तव में क्या सच नहीं है? 'Image.Dispose()' मूल छवि सूचक को रिलीज़ करता है, आप स्वयं स्रोत को देख सकते हैं। – Lucero

1

दिए उदाहरण के बाद ग्राफिक्स जी के साथ एक रिसाव है g.ReleaseHdc(..);

ग्राफिक्स चर

उदाहरण के लिए के रूप में dipose जाना न भूलें:

g.Dispose(); 
संबंधित मुद्दे