Освобождение объекта Graphics

Освобождение объекта Graphics

Если вы внимательно читали несколько последних страниц, то могли заметить, что в некоторых примерах программного кода непосредственно вызывается метод Dispose() объекта Graphics, тогда как в других примерах этого не делается. Поскольку тип Graphics работает с самыми разными неуправляемыми ресурсами, имеет смысл освободить указанные ресурсы как можно быстрее с помощью Dispose() (не дожидаясь, когда это сделает сборщик мусора в процессе финализации). То же самое можно сказать о любом типе, поддерживающем интерфейс IDisposable. При работе с объектами Graphics нужно придерживаться следующих правил.

• Если объект Graphics был создан вами непосредственно, после окончания его использования его следует освободить.

• Если вы ссылаетесь на существующий объект Graphics, его освобождать не следует.

Для того чтобы это стало более понятным, рассмотрите следующий обработчик события Paint.

private void MainForm Paint(object sender, PaintEventArgs e) {

 // Загрузка локального файла *.jpg.

 image myImageFile = Image.FromFile("landscape.jpg");

 // Создание нового объекта Graphics на основе изображения.

 Graphics imgGraphics = Graphics.FromImage(myImageFile);

 // Визуализация новых данных.

 imgGraphics.FillEllipse(Brushes.DarkOrange, 50, 50, 150, 150);

 // Нанесение изображения на форму.

 Graphics g = e.Graphics;

 g.DrawImage(myImageFile, new PointF(0.0F, 0.0F));

 // Освобождение созданного нами объекта Graphics.

 imgGraphics.Dispose();

}

На данном этапе обсуждения не беспокойтесь о том, что некоторые элементы программной логики GDI+ могут быть для вас не вполне понятны. Однако обратите внимание на то, что здесь объект Graphics получается из файла *.jpg, загружаемого (с помощью статического метода Graphics.FromImage()) из локального каталога приложения. Поскольку объект Graphics создается явно, после окончания использовании этого объекта лучше использовать Dispose(), чтобы освободить внутренние ресурсы и сделать их снова доступными для использования другими компонентами системы.

Однако, заметьте, Dispose() не вызывается явно для объекта, который был получен из поступающего на вход PaintEventArgs. Причина в том, что вы не создавали этот объект непосредственно и поэтому не можете гарантировать, что другие части программы не используют его. Очевидно, что при освобождении объекта, используемого в другом месте программы, могут возникать проблемы.

В связи с этим заметим, что если вы забудете вызвать метод Dispose() для объекта, реализующего IDisposable, внутренние ресурсы будут освобождены позже, при обработке объекта сборщиком мусора (см. главу 5). В этом смысле освобождение объекта imgGraphics, строго говоря, не является необходимым. Так что, хотя явное освобождение объектов GDI+, созданных вами непосредственно, делает программный код совершеннее, мы с вами, чтобы сделать примеры программного кода в этой главе более краткими, не будем освобождать каждый тип GDI+ вручную.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

4.1.3 Освобождение индексов

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

4.1.3 Освобождение индексов В том случае, когда ядро освобождает индекс (алгоритм iput, Рисунок 4.4), оно уменьшает значение счетчика ссылок для него. Если это значение становится равным 0, ядро переписывает индекс на диск в том случае, когда копия индекса в памяти отличается от


6.5.6 Освобождение области

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

6.5.6 Освобождение области Если область не присоединена уже ни к какому процессу, она может быть освобождена ядром и возвращена в список свободных областей (Рисунок 6.25). Если область связана с индексом, ядро освобождает и индекс с помощью алгоритма iput, учитывая значение


8.6.2. Освобождение дискового пространства

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

8.6.2. Освобождение дискового пространства Теперь вы знаете, как определить, сколько места займет на диске устанавливаемый пакет, и каков объем свободного пространства на диске. Рассмотрим, что можно сделать, если свободного места не достаточно. Надо заметить, что при


Освобождение места на диске

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Освобождение места на диске Несмотря на внушительные размеры современных жестких дисков, количество свободного места на них имеет тенденцию уменьшаться до нуля, и тогда система сообщит, что свободное место на диске почти закончилось и его необходимо очистить (рис. 8.27).


Класс Graphics

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Класс Graphics Класс System.Drawing.Graphics – это "вход" в функциональные возможности визуализации GDI+. Этот класс не только представляет поверхность, на которой вы хотите разместить изображение (например, поверхность формы, поверхность элемента управления или область в памяти), но


Доступ к объекту Graphics вне обработчика Paint

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Доступ к объекту Graphics вне обработчика Paint В некоторых редких случаях может понадобиться доступ к объекту Graphics вне контекста обработчика события Paint. Предположим, например, что нужно перерисовать небольшой круг с центром в точке (х, у), где был выполнен щелчок кнопки мыши.


Понятия объекта и экземпляра объекта

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —


Понятия объекта и экземпляра объекта

Из книги Linux программирование в примерах автора Роббинс Арнольд

Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —


Освобождение параметров

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Освобождение параметров int pthread_mutexattr_destroy(pthread_mutexattr_t* attr);Вызов разрушает ранее применявшийся объект - атрибутную запись мьютекса, после чего она уже не может более использоваться для инициализации мьютекса без предварительного выполнения вызова pthread_mutexattr_init().На этом


Освобождение мьютекса

Из книги Разработка ядра Linux автора Лав Роберт

Освобождение мьютекса int pthread_mutex_unlock(pthread_mutex_t* mutex);Функция pthread_mutex_unlock() освобождает мьютекс, на который ссылается переменная mutex. Вызвавший поток должен быть владельцем мьютекса. Если есть потоки, блокированные в ожидании освобождения мьютекса, то поток с наивысшим


Освобождение блокировки

Из книги автора

Освобождение блокировки int pthread_rwlock_unlock(pthread_rwlock_t* rwl);Функция освобождает захваченный любым образом объект блокировки чтения/записи. Если объект был захвачен в режиме множественного использования (блокировки по чтению), то количество его освобождений должно равняться


Захват и освобождение спинлока

Из книги автора

Захват и освобождение спинлока int pthread_spin_lock(pthread_spinlock_t* spinner);int pthread_spin_trylock(pthread_spinlock_t* spinner);Это функции захвата и попытки захвата крутящейся блокировки соответственно. Как и для мьютекса, если объект spinner в момент захвата свободен, то поток, вызвавший одну из этих функций,


3.2.1.3. Освобождение памяти: free()

Из книги автора

3.2.1.3. Освобождение памяти: free() Когда вы завершили использование памяти, «верните ее обратно», используя функцию free(). Единственный аргумент является указателем, предварительно полученным с использованием другой функции выделения. Можно (хотя это бесполезно) передать


5.2.1. Выделение и освобождение семафоров

Из книги автора

5.2.1. Выделение и освобождение семафоров Функции semget() и semctl() выделяют и освобождают семафоры, функционируя подобно функциям shmget() и shmctl(). Первым аргументом функции semget() является ключ, идентифицирующий группу семафоров; второй аргумент — это число семафоров в группе;