Что современная Виндология говорит об удалении созданных объектов. Выделенной из Хипа памяти, графических брашей пенов и т.п? Нужно ли обязательно удалять их программе или на выходе система всё "приберёт"? Имеются ввиду объекты которые активно используются на протяжении всей работы программы? Я как дисциплинированный пионер всё время удаляю перед выходом созданные объекты, но в последнее время у меня не покидает ощущение, что я просто трачу лишние байты в коде.
Перечисленное удалять не надо. Но есть вещи, которые надо отдавать назад, например всё, связанное с COM технологией: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/h tm/com_1fuh.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/h tm/com_1fuh.asp
Если неудаление не ведет к утечке gdi ресурсов, то система сама все очистит, хотя "When you no longer need the brush, call the DeleteObject function to delete it." (C) MSDN
А как должен понять ведёт или нет это к утечке? Так вот из фразы непонятно что такое When в данном контексте и говорит ли фраза о том как я Могу удалить ненужное, или о том что я Должен удалить ненужное, или и то и другое, и главное всё таки, что подразумевается под When - может подразумевается не выход из программы а некий этап в работе программы, непонятно из фразы если мне на протяжении всей жизни программы нужна кисть, то по выходу должен ли я её удалять. Т.е. кто "прибираться" должен?
Делал кисти в таймере, забыв удалить их, и по истечение некоторого времени менюшки становились черными. Проведешь мышью по меню - прорисовывается текст итемов, но черная окантовка оставалась. И не только в приложении, но и во всех открытых приложениях, Причём и после закрытия моего. Менюшки приобретали нормальный вид только после перезагрузки компа. Повторюсь: даже если моя прога была уже закрыта. Потом всё-таки нашёл козявку и придавил - всё стало на место. Вот тебе и кисточка.
С помощью такого кода: while(socket(...)!=SOCKET_ERROR); в win2k мне удавалось создать где-то 250-300 тысяч сокетов, после чего из меню "Пуск" исчезала половина пунктов, а из оставшихся большинство не отрисовывались(сплошной серый фон). Лечилось это только перезагрузкой. Посмотрев на это я пришел к выводу что лучше всё удалять самому, а то не извесно каким боком это может обернуться.
Task Manager-ом например, там можно колонки настроить так, чтобы видеть кол-во gdi ресурсов для приложения. В более специализированных пакетах типа AQTime очень легко вычисляются такие места в коде. Иначе будет все как cresta описал, плюс к этому все шрифты поменяются на один - системный, для вин9х все вообще чревато быстрым умиранием. Это означает что если созданная кисть больше не будет использоваться в дальнейшем (ну например - нарисовал все что нужно и в офлайновый DC все сохранил), то удаляем ее, а если нам нужно постоянно перерисовывать что-то этой кистью, то можно и сохранить, а можно создавать каждый раз новую. Сильно зависит от того что и как рисуется и как выводится. В большинстве случаем можно офлайновым DC обойтись - т.е. нарисовать заочно (при ресайзе и т.д.) а при WM_PAINT BitBlt на окно или его часть и все - заодно и от мерцания избавляемся при перерисовке
Есть интересная книга Програмирование графики для Windows автор Фенъ Юань. Там очень подробно рассматривается GDI. далее цитата из книги: Максимальное количество манипуляторов GDI на уровне системы - 16 384 Теперь запустите два экземпляра программы GDIHandles в одной системе и попробуйте вызвать CreatePen по 8192 раза в каждом процессе. Первый процесссоздаст все запрашиваемыe объекты, а второй остановится где-то на 7200. Когда второй процесс перестает создавать объекты, система приходит в замешательство. Даже если переключиться на другой процесс, весь вывод на экран нарушается. Хотя из документации Мicrоsоft возникает впечатление что объекты GDI пользуются только локальными ресурсами процесса, эксперимент наглядно показывает, что объекты GDI выделяются из общесистемного пула ресурсов. Таким образом, интенсивное использование ресурсов GDI одним процессом влияет на работу других процессов. , 8192 + 7200 ~ 15392. Учитывая манипуляторы объектов GDI, используемые окном GDIHandles и другими процессами, можно обоснованно предположить, что максимальное количество манипуляторов GDI в системе равно 16384.
Память из хипа по выходе освобождать е обязательно, а вот объекты GDI система сама не прибирает. Незакрытые хендлы файлов приводят к потере кусков этих самых файлов. Неосвобожденные "снапшоты" системы, полученные через CreateToolhelp32Snapshot, могут завесить 98ю, насчет линейки НТ не знаю. Вообще, мне кажется что WinAPI - не html, и то, что было открыто, лучше закрывать - так, на всякий случай.
Объекты GDI система освобождает сама по завершению процесса. В NT это гарантировано дизайном глобальной таблицы объектов GDI: Код (Text): typedef struct { void * pKernel; unsigned short _nProcess; // идентификатор процесса, которому принадлежит объект unsigned short _nCount; unsigned short nUpper; unsigned short nType; void * pUser; } GDITableCell; взято из Фен Юаня (в Using Softice тоже есть подобная структура) ЗЫ Кстати, имя автора некорректно транслитерировано, мягкого знака не должно быть.
S_T_A_S_ Т.е. хочешь сказать, что если на момент завершения приложения лимит объектов не был исчерпан, то система почистит, а если уже исчерпали - то не будет чистить?
S_T_A_S_ Но cresta и Black_mirror утверждают, что это вылечивалось только перезагрузкой, а не просто завершением процесса.
Сокеты какое-то отношение к таблице GDI имеют? Наверняка там какая-то другая глобальная таблица.. Про лимит объектов aravar всё написал. Для процесса (в 2K) это 8К элементов в таблице. Но таблица "всего" 16К, и она глобальная, поэтому если таких процессов запустить хотя бы 2, то будут проблемы, поскольку explorer тоже использует часть ресурсов. Система не просто так в каждом элементе таблицы хранит идентификатор процесса - при его завершении она смотрит таблицу, и чистит ненужные. Какак обстоит дело в мастае хз, помню где-то видел про утечки в GDI. наверняка есть ещё какие-нибудь баги, эта система вообще не может работать нормально больше 50ти часов по моим опытам :-/
S_T_A_S_ > Какак обстоит дело в мастае хз, помню где-то видел про утечки в GDI. наверняка есть ещё какие-нибудь баги, эта система вообще не может работать нормально больше 50ти часов по моим опытам :-/ Что ты имеешь ввиду, свежеустановленная работает нормально не более 50-ти часов или вообще работает нормально не более 50-ти часов подряд? Дык, обычным винтам тоже вредно работать более 12 часов подряд или нагло врут?
Попробуй не выключать комп пару суток, при этом запускай разные проги - мастдай довольно быстро упадёт XP у меня работала около недели при интенсивном использовани
Я вообще никогда не выключаю мой WinXP - ни дома, ни на работе. Иногда перезагрузится при инсталляции новой программы. Басни всё это...
Про винты, кстати, imho бред полный. Любая техника выходит из строя обычно в моменты включения/выключения. Будь то механика (из-за скачков нагрузки) или электроника (из-за переходных процессов) А время наработки на отказ у винтов очень большое в теории (лет 5 как минимум получается) CRT мониторы, например, не рекомендуется включать больше 2х раз в сутки - т.е. в таком случае их лучше держать включенными всё время. Это даже для трубки лучше.