Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно ли самостоятельно удалать объекты 
:(
    Опции темы
yngwie19
Дата 10.1.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет, у меня вот такой вопрос.
1) Нужно ли после создания кисти ее самостоятельно уничтожать? например:
Код

HBRUSH hBrush = CreatSolidBrush(RGB(255,255,255));
DeleteBrush() //Это скорее всего будет обрабатываться в WM_DESTROY
а также для шрифтов нужно это делать? Или винда перед заверщением программы все сделает сама?
 
2) Нужно ли после изменения в контексте дисплея сохранять шрифт по умолчанию, для последующего его возврата в контекст, или винда опять все сделает сама и нам об этом беспокоиться не стоит. Например:
Код

PAINTSTRUCT ps;
HFONT1 hFont1; \\допустим создадим какой-нибудь логический шрифт
HDC hdc = BeginPaint(hwnd,&ps);
HFONT holdFont SelectFont(hdc,hFont1);
SelectFont(hdc,holdFont);
EndPaint(hwmd,&ps)

Вот здесь в предпоследней строчке обязательно делать возврат начального шрифта или нет?

Это сообщение отредактировал(а) yngwie19 - 10.1.2009, 22:43
PM MAIL   Вверх
GoldFinch
Дата 10.1.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



если после закрытия окна завершается процесс то все удалится само
PM MAIL ICQ   Вверх
yngwie19
Дата 11.1.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, а по поводу второго вопроса? про возврат шрифта в контекст дисплея, чего сказать можете smile 
PM MAIL   Вверх
Dem_max
Дата 11.1.2009, 05:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Да возвращай.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
yngwie19
Дата 11.1.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dem_max, Можешь объяснить почему?
PM MAIL   Вверх
maxim1000
Дата 11.1.2009, 11:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(yngwie19 @  10.1.2009,  22:42 Найти цитируемый пост)
1) Нужно ли после создания кисти ее самостоятельно уничтожать?

я бы очень сильно порекомендовал удалить
хотя бы по той причине, что всё, что выделено/открыто нужно освобождать/закрывать
в частности, в будущем может появиться потребность создавать и удалять много экземпляров таких окон, и если они не будут за собой убирать, получится утечка, а утечка GDI-объектов иногда имеет более неприятные последствия, чем, например, утечка памяти

кроме того, я бы посоветовал уменьшать время жизни объекта как можно сильнее, пока это не приводит к заметному снижению производительности
т.е. в данном случае создавать кисть, когда она нужна, и удалять сразу после использования
а то если каждое приложение будет создавать всё, что когда-нибудь может понадобиться, при старте и освобождать при завершении, GDI-объектов может банально не хватить на всех...


--------------------
qqq
PM WWW   Вверх
GoldFinch
Дата 11.1.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



maxim1000, ExitProcess() удалит все хендлы, о какой утечке ресурсов речь?
кстати, какое максимальное число GDI-объектов?

Это сообщение отредактировал(а) GoldFinch - 11.1.2009, 12:23
PM MAIL ICQ   Вверх
maxim1000
Дата 11.1.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @  11.1.2009,  12:21 Найти цитируемый пост)
ExitProcess() удалит все хендлы, о какой утечке ресурсов речь?

речь идёт о такой ситуации:
при создании окна создаётся GDI-объект, при уничтожении не удаляется
в процессе исполнения программы окна создаются и удаляются много раз (например, что-то типа MessageBox своего)

в таком случае количество созданных, но не удалённых GDI-объектов будет увеличиваться с каждым созданием такого окна

Цитата(GoldFinch @  11.1.2009,  12:21 Найти цитируемый пост)
кстати, какое максимальное число GDI-объектов?

судя по MSDN, оно зависит от доступных ресурсов
кроме того есть возможность ограничить количество для процесса (но там лимит не меньше 256 должен быть), тогда есть шанс избежать неприятной ситуации, когда из-за одной программы с ошибкой начинают страдать все остальные


--------------------
qqq
PM WWW   Вверх
Earnest
Дата 12.1.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Любая нетривиальная программа, работабщая с GDI, для прорисовки создает свои объекты; причем заранее все создать просто невозможно, т.к. неизвестно, что именно может потребоваться. Пример: вывод каких-то объектов, каждый из которых имеет свой цвет (назначаемый пользователем). И если ты будешь только создавать, то минут через 10 работы программы все у тебя станет беленькое и страшненькое ... Утечка ресурсов - очень неприятная вешь. Так что слушай maxim1000 и приучайся всегда аккуратно подчищать за собой. Кстати, имей в виду, что если ты удалишь объект, выбранный в контекст, он на самом деле не удалится. Так что здесь тоже нужно быть аккуратным. 
С шрифтами тоже самое: сам создал - сам удаляй. Насчет того, восстанавливать контекст или нет, завист от типа контекста. Бывают контексты временный (и лично для объекта созданные). Тогда, даже если ты не восстановишь старый объект, он восстановится сам (т.к. при следующем заходе контекст будет ре-инициализирован), но тогда смотри пункт 1 (насчет утечек). Но бывают контексты общие, используемые совместно несколькими окнами. Тогда, сам понимаешь, оставленный тобою мусор может помешать работе в другом месте.
Самый правильный подход - не зависеть от этого. Т.е. при каждом заходе в Paint все настраивать с нуля, а потом все восстановить. Это проще всего сделать одним махом - есть функция Save\RestoreDCState. Кстати, под этим "все" можно понимать также режимы прозрачности, цвет фона\текста и т.д., а не только объекты.


--------------------
...
PM   Вверх
yngwie19
Дата 12.1.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest, Спасибо за грамотный ответ
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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