Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Ошибка программы


Автор: kokcu 31.5.2009, 23:28
Здравствуйте, использую в программе следующую конструкцию:
Код

static public Bitmap trayimage = new Bitmap(32, 32);
        static public Image trayimagen = trayimage;
        static public Graphics g = Graphics.FromImage(trayimagen);
     ................


затем по таймеру раз в 1 сек.
Код

            g.FillRectangle(new SolidBrush(Color.LightBlue), new Rectangle(0, 0, 32, 32));
            if (speed < 100)
            {
                g.DrawString(speed.ToString(), new Font("Times New Roman", 22, FontStyle.Bold), new SolidBrush(Color.DarkRed), -4, 0);
            }
            if (speed >= 100)
            {
                g.DrawString(speed.ToString(), new Font("Verdana", 14), new SolidBrush(Color.DarkRed), -4, 0);
            }
            trayimage = new Bitmap(trayimagen);
            Icon icon = Icon.FromHandle(trayimage.GetHicon());
            notifyIcon1.Icon = icon;

Часа 2 программа работает нормально, но затем вываливает В GDI+ возникла ошибка общего вида. на 
Код

Icon icon = Icon.FromHandle(trayimage.GetHicon());
. Как это исправить?

Автор: KelTron 1.6.2009, 04:56
Думаю, потому, что заканчиваются графические ресурсы, т.к. ты их не освобождаешь.
Их надо диспозить после использования, для этого достаточно создание объекта заклчить в блок using:

Код

using (Brush br = new SolidBrush(Color.LightBlue))
{
    g.FillRectangle(br, new Rectangle(0, 0, 32, 32));
}

if (speed < 100)
{
    using (Font fnt = new Font("Times New Roman", 22, FontStyle.Bold))
    using (Brush br = new SolidBrush(Color.DarkRed))
    {                
        g.DrawString(speed.ToString(), fnt, br, -4, 0);
    }
}
//...и т.д.

Автор: kokcu 1.6.2009, 09:06
Спасибо, помогло!

Автор: kokcu 1.6.2009, 10:02
Нет, поторопился.
Ошибка опять выскакивает.

Автор: diadiavova 1.6.2009, 12:17
kokcu, старый Bitmap тоже надо диспозить перед тем, как создаёшь новый(ели он больше не нужен ессно).
Код

            if(trayimage != null) trayimage.Dispose();
            trayimage = new Bitmap(trayimagen);

Автор: kokcu 1.6.2009, 14:59
Спасибо, сейчас попробую

Автор: kokcu 1.6.2009, 16:03
 smile  Опять.
Вот код таймера
Код

private void timer1_Tick(object sender, EventArgs e)
        {
            
   
            kbytes_k = kbytes - result_n;
            lb = kbytes_k.ToString();

            label1.Text = speed.ToString()+" кб\\с";
            if (lb.Length < 4) { noti = lb + " кб"; label4.Text = noti; }
            if (lb.Length > 3) 
            {
                hh = Convert.ToInt64(kbytes_k) / 1024;
                uu = Convert.ToInt64(kbytes_k) % 1024;
                noti = hh.ToString()+" м "+uu.ToString()+" кб";
                label4.Text = noti;
            }
            
            notifyIcon1.Text = "Скачано всего: " + noti;
            using (Brush br = new SolidBrush(Color.LightBlue))
            {
                g.FillRectangle(br, new Rectangle(0, 0, 32, 32));
            }
            if (speed < 100)
            {
                using (Font fnt = new Font("Times New Roman", 22, FontStyle.Bold))
                using (Brush br = new SolidBrush(Color.DarkRed))
                {
                    g.DrawString(speed.ToString(), fnt, br, -4, 0);
                }
            }
            if (speed >= 100)
            {
                using (Font fnte = new Font("Verdana", 14))
                using (Brush bre = new SolidBrush(Color.DarkRed))
                {
                    g.DrawString(speed.ToString(), fnte, bre, -4, 0);
                }
            }
            
            trayimage = new Bitmap(trayimagen);
            
            Icon icon = Icon.FromHandle(trayimage.GetHicon());
            notifyIcon1.Icon = icon;
            trayimage.Dispose();
          
        }


Автор: kokcu 5.6.2009, 19:27
Ап ( проблема так и не решилась. Перепробовал все что можно

Автор: DVariuS 6.6.2009, 11:04
kokcu, скорее всего проблема в этом коде:
Код

Icon icon = Icon.FromHandle(trayimage.GetHicon());


Инфа из MSDN:
Цитата

When using this method you must dispose of the resulting icon using the DestroyIcon method in the Win32 API to ensure the resources are released.


http://msdn.microsoft.com/en-us/library/system.drawing.icon.fromhandle(VS.80).aspx

Автор: kokcu 6.6.2009, 21:28
Код

private void timer1_Tick(object sender, EventArgs e)
        {
            
   
            kbytes_k = kbytes - result_n;
            lb = kbytes_k.ToString();

            label1.Text = speed.ToString()+" кб\\с";
            if (lb.Length < 4) { noti = lb + " кб"; label4.Text = noti; }
            if (lb.Length > 3) 
            {
                hh = Convert.ToInt64(kbytes_k) / 1024;
                uu = Convert.ToInt64(kbytes_k) % 1024;
                noti = hh.ToString()+" м "+uu.ToString()+" кб";
                label4.Text = noti;
            }
            
            notifyIcon1.Text = "Скачано всего: " + noti;
            using (Brush br = new SolidBrush(Color.LightBlue))
            {
                g.FillRectangle(br, new Rectangle(0, 0, 32, 32));
            }
            if (speed < 100)
            {
                using (Font fnt = new Font("Times New Roman", 22, FontStyle.Bold))
                using (Brush br = new SolidBrush(Color.DarkRed))
                {
                    g.DrawString(speed.ToString(), fnt, br, -4, 0);
                }
            }
            if (speed >= 100)
            {
                using (Font fnte = new Font("Verdana", 14))
                using (Brush bre = new SolidBrush(Color.DarkRed))
                {
                    g.DrawString(speed.ToString(), fnte, bre, -4, 0);
                }
            }
            
            trayimage = new Bitmap(trayimagen);
            
            icon = Icon.FromHandle(trayimage.GetHicon());
            notifyIcon1.Icon = icon;
            trayimage.Dispose();
            icon.Dispose();
            Icon.Dispose();
            
            
        }


\=
Все так же smile. Я скоро сума сойду с этой ошибкой

Автор: DVariuS 6.6.2009, 21:55
kokcu, что-то мне кажется, что кто-то не прочитал статью из MSDN по моей ссылке.
Код

 [System.Runtime.InteropServices.DllImport("user32.dll", CharSet=CharSet.Auto)]
    extern static bool DestroyIcon(IntPtr handle);
   
private void GetHicon_Example(PaintEventArgs e)
    {
                 
        // Create a Bitmap object from an image file.
        Bitmap myBitmap = new Bitmap(@"c:\FakePhoto.jpg");
                 
        // Draw myBitmap to the screen.
        e.Graphics.DrawImage(myBitmap, 0, 0);
                 
        // Get an Hicon for myBitmap.
        IntPtr Hicon = myBitmap.GetHicon();
    
    // Create a new icon from the handle. 
    Icon newIcon = Icon.FromHandle(Hicon);
              
        // Set the form Icon attribute to the new icon.
        this.Icon = newIcon;
        
        // Destroy the Icon, since the form creates
    // its own copy of the icon.
        DestroyIcon(newIcon.Handle);
    
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)