Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с Bpl (borland Package Library)
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Компоненты
nikolasiii
Доброе время суток уважаемые посетители этого чудотворного сайта. smile.gif
У меня вопрос!
//Разрабатываю MDI приложение
Есть такой код:

PackageModule := LoadPackage('MDIPackage.bpl');
//if loaded, try locating the ExecuteChild procedure
if PackageModule <> 0 then
try
@ExecuteChild := GetProcAddress(PackageModule,'ExecuteChild');
except
//display an error message if we fail
ShowMessage ('Package not found');
end;

В процедуре ExecuteChild создаётся MDI форма - MDIChild

В событии OnDestroy главной MDIParent формы происходит выгрузка процедуры ExecuteChild - мне не хочется так делать, так как память выгружается при завершении работы всего приложения.

Вопрос!!!
Как можно выгрузить процедуру, чтобы она не захламляла память, когда будет закрыта форма MDIChild?

Заранее благодарен.
sax_ol
Цитата(nikolasiii @ 24:08:2007, 14:03 )
Как можно выгрузить процедуру, чтобы она не захламляла память

сами поняли что сказали?
nikolasiii
не процедуру выгрузить а память освободить.
Я хочу освободить память после того как закрылась MDI форма, которая была создана в вызванной процедуре, расположенной в bpl пакете.

не процедуру выгрузить а память освободить.
Я хочу освободить память после того как закрылась MDI форма, которая была создана в вызванной процедуре, расположенной в bpl пакете.
sax_ol
Для: nikolasiii
Free And Nil (и FreeAndNil) - рулез форева
либо caFree пользовать
The form is closed, so it's allocated memory is freed by Delphi.
nikolasiii
нет.
ещё раз.
вот работает MDI приложение.
мы вызвали из bpl процедуру ExecuteChild
@ExecuteChild := GetProcAddress(PackageModule,'ExecuteChild');
if Assigned(ExecuteChild) then ExecuteChild();

в этой процедуре создалась форма MDIChild

вот теперь в каком месте сделать UnloadPackage(PackageModule)

откуда мы знаем при каких условиях закроется MDIChild.

поэтому есть вариант со вторым потоком, в нём отслеживать закрытие MDIChild
может быть есть ещё вариант с hooks, хотя я плохо в них разбираюсь.


А вот самый настоящий вариант, интересно мне знать, какой?

точнее сказать в каком месте выгрузить bpl.
Kmet
делай так называемый счетчик ссылок.
nikolasiii
Я не совсем понял. А как он работает?
sax_ol
Для: nikolasiii
ХМ... вы начинали с длл, я так понимаю вам там было все понятно ...
а что стало непонятно с bpl? в контексте топика это практически одинаково
nikolasiii
дело в том, что я раньше никогда не работал с счётчиками ссылок. Само понятие знакомо, я даже вскользь читал об этом где-то, но сам не знаю и не использовал.

как называется это по английски?

а потом. куда это всё воткнуть??? где будет отслеживаться закрытие формы или она сама должна какое-то сообщение куда-то послать?
Pasha
Для: nikolasiii
Неужели MDIPackage.bpl занимает так много памяти, что его приходится постоянно загружать/выгружать? Занимает ли он физическую память вообще? Не будел ли дороже по ресурсам и по времени разработки страдать фигней с отдельными потоками и счетчиками ссылок?
IMHO все это - стремление к бесполезной преждевременной оптипизации.
nikolasiii
это всё стремление к правильному написанию программ.
Если занял память, будь добр освободи её если она тебе не нужна.

если такой способ есть, а он точно должен быть, то почему бы его не использовать.
Pasha
Цитата(nikolasiii @ 24:08:2007, 16:16 )
Если занял память, будь добр освободи её если она тебе не нужна.
*
А если пользователь решит закрыть единственное Child-окно, а потом открыть его еще раз. Тогда к твоему принципу надо дописать примерно следующее: "потом еще раз выдели, а потом еще раз осовободи, и еще раз выдели, и еще раз освободи...и получи фрагментацию."
И вообще, с чего ты взял что LoadPackage полностью загружает package в оперативную память, а не создает, например, файл, отображаемый в память? Не доверяешь разработчикам Dephi?
nikolasiii
в работе с памятью я тоже пас, хотя кое-где может и смогу разобраться.
здесь ситуация практически такая же как и с созданием объектов.
Объект создали, а потом его разрушили. Мы же не создаём объект на весь процесс работы приложения.
Так и здесь. Я не думаю что это займёт много времени.
А потом. Может со временем я все формы в bpl загоню. Я всё равно планирую на модули свои приложения разбивать.
Pasha
Цитата(nikolasiii @ 24:08:2007, 16:34 )
здесь ситуация практически такая же как и с созданием объектов.
*
Нет, здесь ситуация совершенно не такая, как с созданием объектов. Без базовых знаний о работе с памятью в windows объяснение выльется в долгую лекцию с картинками. Пока можешь просто поверить на слово: загрузка dll через LoadPackage уменьшает объем памяти, доступной для создания объектов, на совершенно мизерную величину.
nikolasiii
хорошо. так и быть. буду уничтожать bpl при закрытии приложения.
Спасибо за подсказки.

С уважением, Nikolasiii
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.