Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка программы, В GDI+ возникла ошибка общего вида. 
:(
    Опции темы
kokcu
Дата 31.5.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



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

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());
. Как это исправить?

Это сообщение отредактировал(а) kokcu - 31.5.2009, 23:30
PM MAIL   Вверх
KelTron
Дата 1.6.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Думаю, потому, что заканчиваются графические ресурсы, т.к. ты их не освобождаешь.
Их надо диспозить после использования, для этого достаточно создание объекта заклчить в блок 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);
    }
}
//...и т.д.


Это сообщение отредактировал(а) KelTron - 1.6.2009, 05:03


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
kokcu
Дата 1.6.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Спасибо, помогло!
PM MAIL   Вверх
kokcu
Дата 1.6.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Нет, поторопился.
Ошибка опять выскакивает.
PM MAIL   Вверх
diadiavova
Дата 1.6.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
kokcu
Дата 1.6.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Спасибо, сейчас попробую
PM MAIL   Вверх
kokcu
Дата 1.6.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



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


PM MAIL   Вверх
kokcu
Дата 5.6.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Ап ( проблема так и не решилась. Перепробовал все что можно
PM MAIL   Вверх
DVariuS
Дата 6.6.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: нет
Всего: 8



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.


Icon.FromHandle Method
PM MAIL   Вверх
kokcu
Дата 6.6.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Код

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. Я скоро сума сойду с этой ошибкой
PM MAIL   Вверх
DVariuS
Дата 6.6.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: нет
Всего: 8



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


Это сообщение отредактировал(а) DVariuS - 6.6.2009, 21:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.