![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOL размер приложения в оперативной памяти
DonJad © (2009-02-20 14:30:00)Програмка, висит в трее и вызывает другую прогу.
Собственно заготовка для небольшого менеджера в рамках предприятия.
Размер после компиляции 28,5 кб. Что отлично.
Но вот только в оперативной памяти приложение это занимается 2048 кб!!!
Не такая это задача чтобы в оперативной памяти 2 метра занимать. Тем более что висеть ей там планируется на постоянке.
Подскажите можно ли уменьшить размер хотя бы до 50-200 кб?
Или что пользовать вместо Кола, для решения таких задач?
собственно текст программы:
program KolTray;
uses
windows,
messages,
kol;
{$R *.RES}
var
frmMain,
panel:pControl;
Tray:pTrayIcon;
Menu:pMenu;
{==================================================================}
function CrProcess(s1,s2:string):thandle;
var
StInfo:TStartupInfo; // параметры запуска
SeAttr: TSecurityAttributes; //атрибуты защиты
ProcInfo: TProcessInformation; //параметры процесса
//ProcHandle: THandle; // Хендл процесса.
begin
// Инициализация служебных записей
// для процедуры CreateProcess
//Инициализация структуры StInfo
FillChar(StInfo, SizeOf(StInfo), 0); // Очистка структуры.
StInfo.cb:=SizeOf(StInfo);
stInfo.dwFlags:=STARTF_USESHOWWINDOW;
StInfo.wShowWindow:=SW_SHOWDEFAULT;
// Инициализация структуры SeAttr.
with seAttr do begin
nLength:=SizeOf(SeAttr);
bInheritHandle:=true;
lpSecurityDescriptor:=nil;
end;
// Запуск процесса
if CreateProcess (nil, PChar(s1),
@SeAttr, @SeAttr, false, Normal_priority_class,
nil,
PChar(s2),
StInfo, ProcInfo) then begin
result:= ProcInfo.hProcess; // получить хендл процесса
end
else begin
// raise Exception.Create('Невозможно запустить процесс');
end;
end;
{==================================================================}
//////////////////////////////////////////////////////////
procedure doTrayMouse(dummy:pointer;sender:Tobject;Message:Word);
var
P:Tpoint;
begin
if message = WM_LBUTTONUP then
begin
getcursorpos(p); //узнаем позицию курсора
Menu.PopUp(p.x,p.y); // выводим в этой позиции меню
end;
end;
//////////////////////////////////////////////////////////
procedure doWorkMenu(Dummy:pointer;Sender:pMenu;Item:Integer);
begin
case Item of
0:begin
CrProcess('Y:\Programming\PSPMainProjectDBClient\MainProject.exe ','c:\');
end;
1:;
2:;//Applet.close;
end;{case}
end;
//////////////////////////////////////////////////////////
begin
Applet := NewApplet('KOL Procedure');
frmMain := NewForm(nil,'KOL Procedure');
frmMain.Icon:=LoadIcon(hinstance,'MainIco');
frmMain.Hide; // прячем главное окно
panel := NewPanel(frmMain,esNone);
Menu := NewMenu(panel,0,
[ 'PSP Main Doc',
'-',
'Exit'],
TOnMenuItem( MakeMethod( nil, @doWorkMenu ))
);
Tray := NewTrayIcon(panel,frmMain.Icon) ; // иконка в трее - аналог иконки на форме
Tray.OnMouse:=TOnTrayIconMouse(Makemethod(nil,@doTrayMouse));
run(frmMain)
end.
heilong (2009-02-24 14:59:00) [1]Каждая dll-ка проецируются в виртуальное адресное пространство процесса, что само по себе не занимает памяти как таковой, поскольку всякая dll-ка загружается системой только один раз. Однако глобальные и
статические данные dll-ки дублируются отдельно для каждого процесса в целях безопасности, что собственно и составляет ~1.5Мб физ. памяти, добавьте еще к этому "кучу" вашей программы(+ стэк + др.) и получите те самые ~1.9Мб.
Но есть одно маленькое НО, в случае если системе понадобяться ресурсы, она сможет освободить физ. память процесса до минимум 200кб(50 страниц), и эта цифра не измениться до тех пор пока вы грубо говоря "не наведете мышку на значок в трее", и даже в этом случае будет 300-400 кб. Это происходит из-за того что страницы с глобальными и статическими данными многих из загруженных библиотек невостребованны и потому система удаляет их из памяти (не в своп, а вообще). И практически оставляет только те с которыми необходимо работать (в вашем случае ntdll.dll, kernel32.dll, user32.dll, msctf.dll и код вашей программы) и только в необходимом объеме.
MTsv DN (2009-02-24 10:12:00) [2]Вот тема про которую я говорил:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1205741488&n=10
DonJad (2009-02-24 09:00:00) [3]Ха, нашел!!!
348кб в памяти. Вполне приемлемый результат. :) Всем спасибо!
MTsv DN- отдельное, за то, что подтолкнул в правильном направлении.
Рецепт найдет здесь:
http://www.delphilab.ru/content/view/215/1/
program KolTray;
uses
windows,
sysutils,
messages,
kol;
{$R *.RES}
var
frmMain,
panel:pControl;
Tray:pTrayIcon;
Menu:pMenu;
{==================================================================}
procedure TrimWorkingSet;
var
MainHandle: THandle;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
CloseHandle(MainHandle);
end;
end;
function CrProcess(s1,s2:string):thandle;
var
StInfo:TStartupInfo; // параметры запуска
SeAttr: TSecurityAttributes; //атрибуты защиты
ProcInfo: TProcessInformation; //параметры процесса
//ProcHandle: THandle; // Хендл процесса.
begin
// Инициализация служебных записей
// для процедуры CreateProcess
//Инициализация структуры StInfo
FillChar(StInfo, SizeOf(StInfo), 0); // Очистка структуры.
StInfo.cb:=SizeOf(StInfo);
stInfo.dwFlags:=STARTF_USESHOWWINDOW;
StInfo.wShowWindow:=SW_SHOWDEFAULT;
// Инициализация структуры SeAttr.
with seAttr do begin
nLength:=SizeOf(SeAttr);
bInheritHandle:=true;
lpSecurityDescriptor:=nil;
end;
// Запуск процесса
if CreateProcess (nil, PChar(s1),
@SeAttr, @SeAttr, false, Normal_priority_class,
nil,
PChar(s2),
StInfo, ProcInfo) then begin
result:= ProcInfo.hProcess; // получить хендл процесса
end
else begin
// raise Exception.Create('Невозможно запустить процесс');
end;
end;
{==================================================================}
//////////////////////////////////////////////////////////
procedure doTrayMouse(dummy:pointer;sender:Tobject;Message:Word);
var
P:Tpoint;
begin
if message = WM_LBUTTONUP then
begin
getcursorpos(p); //узнаем позицию курсора
Menu.PopUp(p.x,p.y); // выводим в этой позиции меню
end;
end;
//////////////////////////////////////////////////////////
procedure doWorkMenu(Dummy:pointer;Sender:pMenu;Item:Integer);
begin
case Item of
0:begin
CrProcess('Y:\Programming\PSPMainProjectDBClient\MainProject.exe ','c:\');
end;
1:;
2:;//Applet.close;
end;{case}
end;
//////////////////////////////////////////////////////////
begin
Applet := NewApplet('KOL Procedure');
frmMain := NewForm(nil,'KOL Procedure');
frmMain.Icon:=LoadIcon(hinstance,'MainIco');
frmMain.Hide; // прячем главное окно
panel := NewPanel(frmMain,esNone);
Menu := NewMenu(panel,0,
[ 'PSP Main Doc',
'-',
'Exit'],
TOnMenuItem( MakeMethod( nil, @doWorkMenu ))
);
Tray := NewTrayIcon(panel,frmMain.Icon) ; // иконка в трее - аналог иконки на форме
Tray.OnMouse:=TOnTrayIconMouse(Makemethod(nil,@doTrayMouse));
TrimWorkingSet;
run(frmMain)
end.
DonJad (2009-02-24 08:38:00) [4]тьфу, 50-200 т.е. :)
DonJad (2009-02-24 08:37:00) [5]На большом кол-ве разных по характеристикам. И висеть по тз должна постоянно. Потому и хотелось бы 200-300 кб.
Может можно принудительно в настройках компилятора отрубить какие-нибудь лишнии библиотеки?
D[u]fa (2009-02-20 20:15:00) [6]DonJad, честно говоря ерундой маетесь... зачем такой геморой? на какой машине\системе будет работать прога?
MTsv DN (2009-02-20 15:06:00) [7]Кстати, даже эта версия, с "правленными" System и SysInit, занимает в памяти не сильно меньше:
http://ifolder.ru/10655629
MTsv DN (2009-02-20 14:48:00) [8]Привет...
Вопрос такой тут уже поднимался. В поиске должно быть.
...А по поводу вопроса...KOL тут не причем. Даже следующий код:
program api_test;
function MessageBox(hWnd: WORD; lpText, lpCaption: PChar; uType: WORD): Integer; stdcall;
external 'user32.dll' name 'MessageBoxA';
begin
MessageBox(0, 'Test!!!', 'api_test', 0);
end.
будет занимать в памяти ~1.9 МБ. Дело в компиляторе Дельфи, который добавляет не только user32, но еще kernel32и advapi32...а насколько я помню, эти библы, еще "тянут" за собой "кучу" всего...