Работа с Bpl (borland Package Library)

Тема в разделе "Delphi - Компоненты", создана пользователем nikolasiii, 24 авг 2007.

Статус темы:
Закрыта.
  1. nikolasiii

    nikolasiii Гость

    Доброе время суток уважаемые посетители этого чудотворного сайта. :)
    У меня вопрос!
    //Разрабатываю 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?

    Заранее благодарен.
     
  2. nikolasiii

    nikolasiii Гость

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

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

    nikolasiii Гость

    нет.
    ещё раз.
    вот работает MDI приложение.
    мы вызвали из bpl процедуру ExecuteChild
    @ExecuteChild := GetProcAddress(PackageModule,'ExecuteChild');
    if Assigned(ExecuteChild) then ExecuteChild();

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

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

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

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


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

    точнее сказать в каком месте выгрузить bpl.
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    делай так называемый счетчик ссылок.
     
  5. nikolasiii

    nikolasiii Гость

    Я не совсем понял. А как он работает?
     
  6. nikolasiii

    nikolasiii Гость

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

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

    а потом. куда это всё воткнуть??? где будет отслеживаться закрытие формы или она сама должна какое-то сообщение куда-то послать?
     
  7. Pasha

    Pasha Гость

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

    nikolasiii Гость

    это всё стремление к правильному написанию программ.
    Если занял память, будь добр освободи её если она тебе не нужна.

    если такой способ есть, а он точно должен быть, то почему бы его не использовать.
     
  9. Pasha

    Pasha Гость

    <!--QuoteBegin-nikolasiii+24:08:2007, 16:16 -->
    <span class="vbquote">(nikolasiii @ 24:08:2007, 16:16 )</span><!--QuoteEBegin-->Если занял память, будь добр освободи её если она тебе не нужна.
    [snapback]76309" rel="nofollow" target="_blank[/snapback]​
    [/quote]А если пользователь решит закрыть единственное Child-окно, а потом открыть его еще раз. Тогда к твоему принципу надо дописать примерно следующее: "потом еще раз выдели, а потом еще раз осовободи, и еще раз выдели, и еще раз освободи...и получи фрагментацию."
    И вообще, с чего ты взял что LoadPackage полностью загружает package в оперативную память, а не создает, например, файл, отображаемый в память? Не доверяешь разработчикам Dephi?
     
  10. nikolasiii

    nikolasiii Гость

    в работе с памятью я тоже пас, хотя кое-где может и смогу разобраться.
    здесь ситуация практически такая же как и с созданием объектов.
    Объект создали, а потом его разрушили. Мы же не создаём объект на весь процесс работы приложения.
    Так и здесь. Я не думаю что это займёт много времени.
    А потом. Может со временем я все формы в bpl загоню. Я всё равно планирую на модули свои приложения разбивать.
     
  11. Pasha

    Pasha Гость

    <!--QuoteBegin-nikolasiii+24:08:2007, 16:34 -->
    <span class="vbquote">(nikolasiii @ 24:08:2007, 16:34 )</span><!--QuoteEBegin-->здесь ситуация практически такая же как и с созданием объектов.
    [snapback]76311" rel="nofollow" target="_blank[/snapback]​
    [/quote]Нет, здесь ситуация совершенно не такая, как с созданием объектов. Без базовых знаний о работе с памятью в windows объяснение выльется в долгую лекцию с картинками. Пока можешь просто поверить на слово: загрузка dll через LoadPackage уменьшает объем памяти, доступной для создания объектов, на совершенно мизерную величину.
     
  12. nikolasiii

    nikolasiii Гость

    хорошо. так и быть. буду уничтожать bpl при закрытии приложения.
    Спасибо за подсказки.

    С уважением, Nikolasiii
     
Загрузка...
Похожие Темы - Работа Bpl (borland
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    30
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    55
  4. lelik200969
    Ответов:
    0
    Просмотров:
    53
  5. Kozolick
    Ответов:
    0
    Просмотров:
    142
Статус темы:
Закрыта.

Поделиться этой страницей