Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2006-04-23

Re: Течет ручей, бежит ручей. И ты ничья и я ничей.

Здравствуйте !

> Сабж касается утечки памяти, связанные с SetBitmap, который
> через цикл перерисовается картинка. 5 переменных HBITMAP,
> в SetBitmap, инициализируются
> при создании кнопки. Попытки использовать DeleteObject
Эти переменные надо инициализировать, сохранять, пока ведется
работа (всякие SetBitmap-ы используются, и.т.д.)
Потом, когда битмапы больше не нужны, надо выбрать для кнопки
битмап SetBitmap(NULL) и уничтожить все битмапы при помощи DeleteObject.
Тогда не будет утечки ресурсов.
Вобщем, идеология работы с ресурсами GDI такая:
1. создал
2. выбрал куда то, при этом сохранив то, что там было ранее
Например, при выборе битмапа в совместимый контекст устройства,
надо сохранять дескриптор битмапа, который в нем уже выбран.
3. попользоваться
4. вернуть все обратно (старые битмапы выбрать туда, где они были раньше,
и.т.д.).
5. убить все созданные ресурсы

то есть убивать надо все что создавал, но при этом GDI-ресурс не должен
где то использоваться, а то может не убиться.
Например, SEtBitmap можно сделать не только кнопке, но и static-у, так
вот, static control выбирает этот битмап в совместимый контекст и если
после SetBitmap сделать DeleteObject, битмап не уничтожится и произойдет
утечка ресурсов.

> же показывается быстрый
> рост каких-то GDI handles.
GDI handles - дескрипторы GDI объектов (перьев, битмапов, кистей,
контекстов, и.т.д.). ОС имеет таблицу дескрипторов GDI объектов
в ней всего 16384 элемента. На процесс может быть выделено некоторое
максимально количесво ресурсов GDI. После этого функции типа
CreatePen, CreateBitmap, и.т.д. начнут возвращать NULL.
Максимальное количество ресурсов на процесс прописано где то в реестре.
Если несколько приложений откушают все ресурсы, система начнет глючить -
окна приложений перестанут перерисовываться, и.т.д.
Поэтому ресурсы надо освобождать. Порисовал - освободил.

> Подскажите, люди, где про них почитать можно.
В MSDN, наверно. Ну и всякие книжки по программированию в винде, где
про рисование упоминается.

   2006-04-23 17:21:58 (#540817)

Re: Течет ручей, бежит ручей. И ты ничья и я ничей.

Hello Deni_S,

Похоже этот SetBitmap глючноват сам по себе. Так, делаю в цикле
SetBitmap(NULL);
т.е. никакая картинка непрорисовывается и все равно происходит
описанная ситуация (даже в сочетании с DeleteObject). Думается надо попробовать
использовать
какую-нибудь другую альтернативу, например, ImageList_DrawEx
во время самопрорисовки.

Friday, April 21, 2006, 9:40:34 PM, you wrote:

D> Hello comp,

D> Сабж касается утечки памяти, связанные с SetBitmap, который работает в цикле.
D> Т.е. на кнопке
D> через цикл перерисовается картинка. 5 переменных HBITMAP, которые передаются
D> в SetBitmap, инициализируются
D> при создании кнопки. Попытки использовать DeleteObject приводят к стиранию
картиночки
D> на кнопке. Такой
D> вот интересный случай.
D> Еще интересное наблюдение - утечки памяти определяю через таскменеджер
D> (там все время растет память, выделяемая
D> программой, когда перерисовывается картинка на кнопке), там же показывается
быстрый
D> рост каких-то GDI handles.
D> Подскажите, люди, где про них почитать можно.

   2006-04-23 15:24:21 (#540791)

Re: Течет ручей, бежит ручей. И ты ничья и я ничей.

Deni_S> Hello comp,

Deni_S> Сабж касается утечки памяти, связанные с SetBitmap, который работает
в цикле.
Deni_S> Т.е. на кнопке
Deni_S> через цикл перерисовается картинка. 5 переменных
Deni_S> HBITMAP, которые передаются
Deni_S> в SetBitmap, инициализируются
Deni_S> при создании кнопки. Попытки использовать
Deni_S> DeleteObject приводят к стиранию картиночки
Deni_S> на кнопке. Такой
Deni_S> вот интересный случай.
Deni_S> Еще интересное наблюдение - утечки памяти
Deni_S> определяю через таскменеджер
Deni_S> (там все время растет память, выделяемая
Deni_S> программой, когда перерисовывается картинка на
Deni_S> кнопке), там же показывается быстрый
Deni_S> рост каких-то GDI handles.
Deni_S> Подскажите, люди, где про них почитать можно.

Попробуё сделать таким-вот образом:
1 Создай переменную СBitmap *pOldBmp;
2 Вызывай функцию pOldBmp=SetBitmap(твой_рисунок);
3 Затем, в конце цикла
pDC->SelectObject( pOldBmp ); //где pDC- контекст рисования

Вроде, должно сработать.

Павел a.k.a BOER mailto:bo***@u*****.fm

Номер выпуска : 5287
Возраст листа : 945 (дней)
Количество подписчиков : 545
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/540780
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2006-04-23 13:50:20 (#540780)