Недавно вы начали проект, который включает в себя множество форм, кадров и дополнительных компонентов, что привело к увеличению размера приложения. Вы используете три исполняемых файла, созданных в Delphi 2009, которые также делятся общими формами и кадрами. Для решения этой проблемы вы использовали DLL, чтобы поделиться этими формами, но столкнулись с ошибкой TFont. После совета из интернета вы выбрали опцию "Build with runtime packages", и все заработало идеально.
Однако, использование этой опции привело к увеличению использования памяти до 21.5 МБ, в то время как без неё использование памяти составляло всего 2000 КБ. Также замедлилась работа компилятора. Вам необходимо распространять проект с тремя исполняемыми файлами, DLL и runtime packages от Delphi, что усложняет процесс распространения.
Вы хотите понять, как использование памяти увеличилось, и распространять только три исполняемых файла и DLL, как это делается с обычными Delphi-приложениями. Вы даже пытались использовать менеджеры памяти, но это не помогло.
Код, который вы использовали:
В основном приложении:
procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame = function(Owner: TComponent; TheParent: TWinControl): TFrame; stdcall;
var
GetTheFrame: TGetTheFrame;
begin
try
GetTheFrame(application, TabSheet1).Free;
except
end;
// ...
// Загрузка DLL и вызов функции GetTheFrame
// ...
end;
В DLL:
Function GetTheFrame(Owner: TComponent; TheParent: TWinControl): TFrame; stdcall;
begin
Result := TFrame2.Create(Owner);
Result.Parent := TheParent;
end;
exports GetTheFrame;
Вы хотите узнать, как решить эту проблему и как создать такое приложение без использования опции "Build with runtime packages".
Подходы к решению проблемы:
Перемещение ресурсов в DLL: Попробуйте переместить изображения и формы в DLL как ресурсы. Вызывайте их при необходимости и освобождайте, если они не используются.
Проверка утечек памяти: Убедитесь, что в вашем приложении нет утечек памяти. Использование FastMM4 может помочь в выявлении и устранении таких утечек.
Исключение неиспользуемых BPL: Некоторые BPL подключаются даже если вы их не используете. Исключите те, которые не нужны, чтобы уменьшить размер исполняемого файла и использование памяти.
Использование BPL вместо DLL: Создайте новый пакет, добавьте в него код для вашего кадра и используйте его в приложении, как если бы вы не использовали DLL.
Альтернативное решение:
Если вы не можете использовать BPL, так как часть программного обеспечения написана на VB, попробуйте оптимизировать использование DLL следующим образом:
Оптимизация загрузки DLL: Убедитесь, что DLL загружаются только тогда, когда это необходимо, и освобождаются после использования.
Кэширование: Используйте кэширование для кадров, чтобы не создавать их каждый раз при необходимости.
Управление памятью: Тщательно управляйте объектами, создаваемыми в памяти, и освобождайте их, когда они больше не нужны.
Пример оптимизации:
В основном приложении, после оптимизации:
procedure TForm1.Button1Click(Sender: TObject);
var
MyFrame: TFrame2;
begin
if not Assigned(MyFrame) then
MyFrame := TFrame2.CreateFrameInstance(TabSheet1);
MyFrame.Parent := TabSheet1;
end;
type
TFrame2 = class(TFrame)
private
function CreateFrameInstance(Parent: TWinControl): TFrame2;
end;
function TFrame2.CreateFrameInstance(Parent: TWinControl): TFrame2;
begin
Result := TFrame2.Create(nil);
if Assigned(GetFrameCache) then
Result := GetFrameCache.GetFrame(TFrame2);
Result.Parent := Parent;
end;
type
TFrameCache = class
private
FFrames: TList<TFrame>;
function GetFrame(AFrameType: TFrameClass): TFrame;
end;
function TFrameCache.GetFrame(AFrameType: TFrameClass): TFrame;
begin
// Реализация кэширования кадров
end;
var
GetTheFrameCache: TFrameCache = nil;
begin
if not Assigned(GetTheFrameCache) then
GetTheFrameCache := TFrameCache.Create;
end;
Следуя этим рекомендациям, вы сможете оптимизировать использование памяти и уменьшить размер исполняемых файлов в вашем Delphi-проекте, используя DLL без необходимости включения "Build with runtime packages".
Оптимизация исполняемых файлов в Delphi для уменьшения размера и использования памяти с использованием DLL и Runtime Packages, с целью решения проблемы увеличенного потребления памяти и улучшения процесса распространения проекта.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS