![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| ivan219 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
Вобщем такое дело я загружаю библиотеку динамически (статически не подходит) и так как к ней идёт постоянное обращение она должна постоянно быть загружена, я её не выгружаю пока программа запущена и выгружаю только когда закрываю программу.
Загрузка.
Выгрузка.
Вопрос: как зедлать так чтоб вовремя появления ошибки т.е. когда приложение закрылось не через Destroy а както иначе или вобще повисло и закрыть его можно только через Диспетчер задачь то Dll выгружалась |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
При уничтожении программы автоматически освобождаются все занятые ею хэндлы.
Следовательно dll по любому будет выгружена, т.к. больше нет владельцев хэндла. |
|||
|
||||
| ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
А зачемже тогда везде пишут что надо незабывать освобождать память да и вот такие конструкции для чего
Этоже гарантированно выгружает Dll при ошибке. Что то я не пойму |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Разумеется по хорошему нужно выгружать.
А по плохому - это за тебя сделает винда. Кроме того, такие обработчики нужны обязательно, если программа не завершается, а выгрузить нужно. Но в твоём случае она завершается. Так что выгружай, как обычно. Если вдруг что-то и произойдёт, и твоя программа не сможет ничего сделать, что маловероятно, то у тебя и выбора-то нет. Но винда всё сделает за тебя. Не будет она держать в памяти бесхозную дллину. Добавлено @ 00:05
Для XP не актуально, но злоупотреблять не стОит. То есть по возможности нужно выгружать. А, если уж аварийная ситуация, тут ничего не поделаешь - пусть винда её разруливает, раз твой процесс больше не рулит. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Вообще для успешного программирования нужно следовать определеным принципам, один из которых "захватил - освободи" или "открыл - закрой". Их надо соблюдать всегда это структурирует програму и делает ее однообразной. Однообразие дает предсказуемость, и как следствие прозрачность кода. Уникальный код как правило сложен в понимании и трудно изменяем, так как для его коректирования требуется держать в голове все его особенности. При однообразном програмировании этого не нужно делать, поскольку ты и так знаешь как у тебя должно быть сделано по правилам, и если правила соблюдены, то все работает именно так как ты и предпологал.
Система принципов програмирования позволяет минимизировать число логических ошибок и оставить поле для модификаций. Это оправдано по крайней мере экономически, поскольку выигрыш двух десятков строк обернется в будущем двумя десятками проблем при поиске сложных ошибок. После того как проект превысит определенное число строк, то он неизбежно зайдет в тупик (если написан не по правилам), это произойдет потому как исправление ошибок начнет приводить к появлению новых ошибок, а это уже труба -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
alexeis1, тут ты прав уменя действительно труба в старом проекте но сейчас я его переделываю на новый лад может проще выйдет
А это правило невсегда можно соблюсти. Вот мой проект прямое этому докозательство (на данный момент) хотя может и смогу обойти и зделать как надо Snowy, моей прогой будут пользоватся нетолько в XP но ещё и 98 так что надо думать Добавлено @ 03:21 А ведь когда окно закрывается Windows то сам Windows посылает ему какоето сообщение может можно как то через это вурулить |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
||||
|
||||
| ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
Snowy, говорит что для старых Windows это проблематично
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
WM_CLOSE -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Может быть проблематично, если ты там выделяешь память в больших количествах.
Но ты ведь этого не делаешь... Что касается сообщения... Да, по этому сообщению и вызывается деструктор формы. Если он не вызвался, то ничего ты сделать не сможешь - значит твоя программа не отвечает. |
|||
|
||||
| bazzzman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 24.7.2006 Репутация: 0 Всего: 2 |
по любому будет выгружена - не правда. У меня программа ставит хуки (LL и SHELL) из dll. Так вот (иногда и не всех экземплярах Windows XP, но баг есть и он регулярно напоминает о себе) при закрытии приложения dll остается в памяти. Т.е. ее невозможно перезаписать. Причем видно ее processexplorer'ом у чужих приложений. Это наверное из-за SetWindowsHookEx(WH_SHELL). Проходит около 1 минуты и dll выгружается сама, без моей помощи Думаю это связано c кэшем dll в Windows XP. Даже в NullSoft Install System (инсталлятор) есть команды в скриптах для принудительной выгрузки таких dll перед перезаписью. Получается WIndows XP не моментально выгружает все dll, а некоторые из них оставляет в памяти на некоторое время. Не важно почему это происходит. Как гарантировано выгрузить dll из памяти? |
|||
|
||||
| tnt17 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 6.10.2006 Репутация: нет Всего: нет |
Оставляет, так как в системной очереди сообщений могут находиться те, которые обрабатываются либой. Как только станет ясно что таковых нет и процесс установивший хук завершен - либа выгружается из памяти. Это сообщение отредактировал(а) tnt17 - 16.10.2006, 10:38 |
|||
|
||||
| bazzzman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 24.7.2006 Репутация: 0 Всего: 2 |
Интересно... Хук снимаю. И что еще могут обрабатывать чужие процессы в моей длл в течении минуты?
Это кэш 100%. Винда это делает чтобы не тратить время на загрузку часто используемых длл в память. Вопрос не в том почему это происходит, а как от этого избавится? |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |