Удаление созданных объектов

Тема в разделе "WASM.WIN32", создана пользователем The Svin, 22 фев 2005.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Что современная Виндология говорит об удалении созданных объектов. Выделенной из Хипа памяти, графических брашей пенов и т.п? Нужно ли обязательно удалять их программе или на выходе система всё "приберёт"? Имеются ввиду объекты которые активно используются на протяжении всей работы программы?

    Я как дисциплинированный пионер всё время удаляю перед выходом созданные объекты, но в последнее время у меня не покидает ощущение, что я просто трачу лишние байты в коде.
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  3. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    Если неудаление не ведет к утечке gdi ресурсов, то система сама все очистит, хотя "When you no longer need the brush, call the DeleteObject function to delete it." (C) MSDN
     
  4. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    А как должен понять ведёт или нет это к утечке?



    Так вот из фразы непонятно что такое When в данном контексте и говорит ли фраза о том как я Могу удалить ненужное, или о том что я Должен удалить ненужное, или и то и другое, и главное всё таки, что подразумевается под When - может подразумевается не выход из программы а некий этап в работе программы, непонятно из фразы если мне на протяжении всей жизни программы нужна кисть, то по выходу должен ли я её удалять. Т.е. кто "прибираться" должен?
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Делал кисти в таймере, забыв удалить их, и по истечение некоторого времени менюшки становились черными. Проведешь мышью по меню - прорисовывается текст итемов, но черная окантовка оставалась. И не только в приложении, но и во всех открытых приложениях, Причём и после закрытия моего. Менюшки приобретали нормальный вид только после перезагрузки компа. Повторюсь: даже если моя прога была уже закрыта. Потом всё-таки нашёл козявку и придавил - всё стало на место. Вот тебе и кисточка.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    С помощью такого кода:



    while(socket(...)!=SOCKET_ERROR);



    в win2k мне удавалось создать где-то 250-300 тысяч сокетов, после чего из меню "Пуск" исчезала половина пунктов, а из оставшихся большинство не отрисовывались(сплошной серый фон). Лечилось это только перезагрузкой. Посмотрев на это я пришел к выводу что лучше всё удалять самому, а то не извесно каким боком это может обернуться.
     
  7. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев


    Task Manager-ом например, там можно колонки настроить так, чтобы видеть кол-во gdi ресурсов для приложения. В более специализированных пакетах типа AQTime очень легко вычисляются такие места в коде.

    Иначе будет все как cresta описал, плюс к этому все шрифты поменяются на один - системный, для вин9х все вообще чревато быстрым умиранием.





    Это означает что если созданная кисть больше не будет использоваться в дальнейшем (ну например - нарисовал все что нужно и в офлайновый DC все сохранил), то удаляем ее, а если нам нужно постоянно перерисовывать что-то этой кистью, то можно и сохранить, а можно создавать каждый раз новую.





    Сильно зависит от того что и как рисуется и как выводится. В большинстве случаем можно офлайновым DC обойтись - т.е. нарисовать заочно (при ресайзе и т.д.) а при WM_PAINT BitBlt на окно или его часть и все - заодно и от мерцания избавляемся при перерисовке :)
     
  8. aravar

    aravar New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2004
    Сообщения:
    35
    Есть интересная книга Програмирование графики для Windows автор Фенъ Юань. Там очень подробно рассматривается GDI.

    далее цитата из книги:

    Максимальное количество манипуляторов GDI на уровне системы - 16 384

    Теперь запустите два экземпляра программы GDIHandles в одной системе и по­пробуйте вызвать CreatePen по 8192 раза в каждом процессе. Первый процесссоздаст все запрашиваемыe объекты, а второй остановится где-то на 7200.

    Когда второй процесс перестает создавать объекты, система приходит в заме­шательство. Даже если переключиться на другой процесс, весь вывод на экран нарушается.

    Хотя из документации Мicrоsоft возникает впечатление что объекты GDI пользуются только локальными ресурсами процесса, эксперимент наглядно по­казывает, что объекты GDI выделяются из общесистемного пула ресурсов. Та­ким образом, интенсивное использование ресурсов GDI одним процессом влия­ет на работу других процессов. ,

    8192 + 7200 ~ 15392. Учитывая манипуляторы объектов GDI, используемые окном GDIHandles и другими процессами, можно обоснованно предположить, что максимальное количество манипуляторов GDI в системе равно 16384.
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Память из хипа по выходе освобождать е обязательно, а вот объекты GDI система сама не прибирает. Незакрытые хендлы файлов приводят к потере кусков этих самых файлов. Неосвобожденные "снапшоты" системы, полученные через CreateToolhelp32Snapshot, могут завесить 98ю, насчет линейки НТ не знаю. Вообще, мне кажется что WinAPI - не html, и то, что было открыто, лучше закрывать - так, на всякий случай.
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Объекты GDI система освобождает сама по завершению процесса. В NT это гарантировано дизайном глобальной таблицы объектов GDI:
    Код (Text):
    1.  
    2. typedef struct
    3. {
    4.     void          *  pKernel;
    5.     unsigned short  _nProcess; // идентификатор процесса, которому принадлежит объект
    6.     unsigned short  _nCount;
    7.     unsigned short   nUpper;
    8.     unsigned short   nType;
    9.     void          *  pUser;
    10. } GDITableCell;
    взято из Фен Юаня (в Using Softice тоже есть подобная структура)



    ЗЫ

    Кстати, имя автора некорректно транслитерировано, мягкого знака не должно быть.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    S_T_A_S_

    Тогда возникает вопрос, откуда же такие последствия?
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ну дык процесс-то не был завершен.
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    S_T_A_S_



    Т.е. хочешь сказать, что если на момент завершения приложения лимит объектов не был исчерпан, то система почистит, а если уже исчерпали - то не будет чистить?
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    S_T_A_S_

    Но cresta и Black_mirror утверждают, что это вылечивалось только перезагрузкой, а не просто завершением процесса.
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Сокеты какое-то отношение к таблице GDI имеют? Наверняка там какая-то другая глобальная таблица..



    Про лимит объектов aravar всё написал.

    Для процесса (в 2K) это 8К элементов в таблице.

    Но таблица "всего" 16К, и она глобальная, поэтому если таких процессов запустить хотя бы 2, то будут проблемы, поскольку explorer тоже использует часть ресурсов.



    Система не просто так в каждом элементе таблицы хранит идентификатор процесса - при его завершении она смотрит таблицу, и чистит ненужные.



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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    S_T_A_S_

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



    Что ты имеешь ввиду, свежеустановленная работает нормально не более 50-ти часов или вообще работает нормально не более

    50-ти часов подряд?

    Дык, обычным винтам тоже вредно работать более 12 часов подряд или нагло врут?
     
  17. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Попробуй не выключать комп пару суток, при этом запускай разные проги - мастдай довольно быстро упадёт :derisive:

    XP у меня работала около недели при интенсивном использовани
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
  19. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Я вообще никогда не выключаю мой WinXP - ни дома, ни на работе. Иногда перезагрузится при инсталляции новой программы. Басни всё это...
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Про винты, кстати, imho бред полный.

    Любая техника выходит из строя обычно в моменты включения/выключения.

    Будь то механика (из-за скачков нагрузки) или электроника (из-за переходных процессов)

    А время наработки на отказ у винтов очень большое в теории (лет 5 как минимум получается)

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