Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ускорение загрузки плагинов в приложениях Delphi: оптимизация процесса

Delphi , Программа и Интерфейс , Интерфейс

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

Проблема загрузки плагинов

Загрузка плагинов происходит на этапе инициализации приложения, когда оно загружает все DLL из определенной папки, соответствующие заданному шаблону имен. Пример кода, используемого для загрузки плагинов, выглядит следующим образом:

if FindFirst(cfg.ExePath+cPathPlugins+'\np*.npl', faAnyFile, SR)<>0
then Exit; // npl файлы на самом деле - переименованные DLL
PluginHost := TPluginHost.Create as IPluginHost;
Plugins    := TObjectList<TPluginInfo>.Create(True);
repeat
  if (SR.Attr &lt;&gt; faDirectory)
  then begin
    dll := LoadLibrary(PChar(cfg.ExePath+cPathPlugins+SR.Name));
    if dll&lt;&gt;0
    then begin
      @PluginInit := GetProcAddress(dll, 'PluginInitialize');
      if Assigned(PluginInit)
      then begin
        Plugin := TPluginInfo.Create;
        try
          Plugin.Dll  := dll;
          Plugin.Intf := PluginInit(PluginHost);
          Plugins.Add(Plugin);
        except
          Plugin.Free;
        end;
      end
      else FreeLibrary(dll);
    end;
  end;
until FindNext(SR)&lt;&gt;0;
System.SysUtils.FindClose(SR);

Этот код занимает около 45 секунд для загрузки семи плагинов, несмотря на то, что в DLL нет кода инициализации, и PluginInitialize просто передает интерфейс хоста и возвращает интерфейс плагина.

Влияние интерфейсов на скорость загрузки

Пользователь задает вопрос о том, влияет ли количество методов в интерфейсах на скорость загрузки плагинов. В теории, количество методов не должно существенно влиять на скорость загрузки, но это стоит подтвердить.

Возможные решения

Рассмотрим, можно ли уменьшить время загрузки, сохраняя загрузку плагинов при старте приложения. Альтернативный подход заключается в загрузке имен плагинов из базы данных и загрузке самих DLL только при первом использовании. Однако, такой подход не подходит, так как некоторые плагины должны запускаться автоматически при выполнении определенных событий в приложении.

Другой вариант - загрузка плагинов в фоновом режиме на другом потоке. Однако, использование потоков может быть рискованным, так как существует вероятность доступа к переменным, которые модифицируются другим потоком. В данном случае, такой риск отсутствует, так как после загрузки плагинов происходит доступ к их именам и добавление в TButtonGroup, который создается до начала поиска DLL.

Подтвержденное решение

Проблема, с которой столкнулся пользователь, заключается в большом размере загружаемых DLL. Рекомендуется использовать runtime packages для создания DLL, чтобы код загружался только один раз. Каждая DLL будет включать дубликаты одного и того же кода, и LoadLibrary будет загружать DLL и вызывать код инициализации только один раз для хост-приложения.

Оптимизация с использованием runtime packages

Для изменения того, какие runtime packages будут отдельными, а какие включены в проект, необходимо перейти в раздел "Runtime Packages" опций проекта. Установите флажок "Link with runtime packages" и в текстовом поле ниже укажите имена packages, которые хотите оставить отдельными.

Альтернативное решение

Еще один подход - перенести общий код плагинов в ресурсный DLL, который могут использовать все плагины. Загрузите этот DLL из процесса хоста и передайте его дескриптор в каждый плагин DLL для использования.

Заключение

Оптимизация загрузки плагинов в приложениях на Delphi может быть достигнута за счет использования runtime packages и переноса общего кода в отдельный ресурсный DLL. Это позволит уменьшить время загрузки и размер развертывания приложения.

Создано по материалам из источника по ссылке.

Ускорение процесса загрузки плагинов в приложениях на Delphi достигается через оптимизацию использования интерфейсов и кода, например, путем применения runtime packages и переноса общего кода в отдельный ресурсный DLL.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интерфейс ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 14:54:29/0.0055060386657715/1