Yanıt Bellek kullanımındaki problem

  • 01 Haziran 2012 Cuma 07:53
     
      Kod İçerir
                   private void Ciz() {	int width = Screen.PrimaryScreen.Bounds.Width;	int height = Screen.PrimaryScreen.Bounds.Height;  	Bitmap resim = new Bitmap(width, height);    	Graphics gr = Graphics.FromImage(resim);	gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height));   	Random rnd = new Random();	gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000));	Point[] p = new Point[3];	p[0] = new Point(rnd.Next(30), rnd.Next(60));	p[1] = new Point(rnd.Next(100), rnd.Next(260));	p[2] = new Point(rnd.Next(30), rnd.Next(10));	gr.DrawPolygon(Pens.AliceBlue, p);	pcResimKutusu.Image = resim;}

    Ciz metodu timer nesnesi tarafından her 300milisaniyede çağrılıyor.Herşey normal ancak her 300milisaniyede projenin bellek miktarı

    artıyor.Burda metod private tanımlanmış neden herseferinde yeni değerler oluşturulup eski değerler kaldırılmıyor acaba sorunu garbage collector ilemi çözecem?


    • Düzenleyen Mustafa06 01 Haziran 2012 Cuma 07:54
    •  

Tüm Yanıtlar

  • 01 Haziran 2012 Cuma 08:17
    Moderatör
     
     
    GC nin silebildiğinden daha hızlı instance oluşuyor. Ciz methodu içindeki çizim işlerini yapan Classların instance larını using içinde deklare ediniz. yada işi bitince Dispose() methodlarını çağırınız.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

  • 01 Haziran 2012 Cuma 08:56
     
      Kod İçerir
              private void Ciz() {               int width = Screen.PrimaryScreen.Bounds.Width;               int height = Screen.PrimaryScreen.Bounds.Height;                              using (Graphics gr = Graphics.FromImage(resim)) {                    Bitmap resim = new Bitmap(width, height);                    gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height));                    Random rnd = new Random();                    gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000));                    Point[] p = new Point[3];                    p[0] = new Point(rnd.Next(30), rnd.Next(60));                    p[1] = new Point(rnd.Next(100), rnd.Next(260));                    p[2] = new Point(rnd.Next(30), rnd.Next(10));                    gr.DrawPolygon(Pens.AliceBlue, p);                    pcResimKutusu.Image = resim;               }          }
    using içine aldım ama yine aynı problem devam ediyor, gr.Dispose(); ve resim.Dispose(); yaptım görüntü gelmiyor bu sefer
  • 01 Haziran 2012 Cuma 15:56
     
     
    sabahtan beri uğraşıyorum olmuyor yav çözümü yokmu bunun acep
  • 04 Haziran 2012 Pazartesi 09:10
    Moderatör
     
     Yanıt Kod İçerir

    Mustafa selam,

            int width = Screen.PrimaryScreen.Bounds.Width;
            int height = Screen.PrimaryScreen.Bounds.Height;
            Bitmap resim ;
            private void Ciz() { 
                
                if (resim == null)
                {
                  resim = new Bitmap(width, height);
                }
    
    
     using (Graphics gr = Graphics.FromImage(resim))
                {
                    gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height));
                    Random rnd = new Random();
                    gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000));
                    Point[] p = new Point[3];
                    
                    p[0] = new Point(rnd.Next(30), rnd.Next(60));
                    p[1] = new Point(rnd.Next(100), rnd.Next(260));
                    p[2] = new Point(rnd.Next(30), rnd.Next(10));
                    gr.DrawPolygon(Pens.AliceBlue, p);
                }
                pcResimKutusu.Image = resim;
            }

    Yukarıdaki gibi dener misin? Bu şekilde oluşturulan graphics nesnelerin dispose edilmiş oluyor ve asıl performans kazancını her 300ms te bir yeni bir bitmap oluşturmayarak elde ediyoruz. Bu şekilde test ettim,bellek kullanımı eski duruma nazaran çok çok cüzi bir oranda artıp GC nin de bir süre sonra devreye girmesiyle sabitleniyor.

    Deneyip geri dönüşte bulunursanız çok sevinirim.

    İyi çalışmalar.


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!

  • 16 Haziran 2012 Cumartesi 20:39
     
     
    teşekkür ettim gayet güzel çalışıyor ellerine sağlık ;)