Форум: "KOL";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
ВнизKOL размер приложения в оперативной памяти Найти похожие ветки
← →
DonJad © (2009-02-20 14:30) [0]Програмка, висит в трее и вызывает другую прогу.
Собственно заготовка для небольшого менеджера в рамках предприятия.
Размер после компиляции 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.
← →
MTsv DN (2009-02-20 14:48) [1]Привет...
Вопрос такой тут уже поднимался. В поиске должно быть.
...А по поводу вопроса...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...а насколько я помню, эти библы, еще "тянут" за собой "кучу" всего...
← →
MTsv DN (2009-02-20 15:06) [2]Кстати, даже эта версия, с "правленными" System и SysInit, занимает в памяти не сильно меньше:
http://ifolder.ru/10655629
← →
D[u]fa (2009-02-20 20:15) [3]DonJad, честно говоря ерундой маетесь... зачем такой геморой? на какой машине\системе будет работать прога?
← →
DonJad © (2009-02-24 08:37) [4]На большом кол-ве разных по характеристикам. И висеть по тз должна постоянно. Потому и хотелось бы 200-300 кб.
Может можно принудительно в настройках компилятора отрубить какие-нибудь лишнии библиотеки?
← →
DonJad © (2009-02-24 08:38) [5]тьфу, 50-200 т.е. :)
← →
DonJad © (2009-02-24 09:00) [6]Ха, нашел!!!
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.
← →
MTsv DN (2009-02-24 10:12) [7]Вот тема про которую я говорил:
http://delphimaster.net/view/11-1205741488/
← →
heilong (2009-02-24 14:59) [8]Каждая dll-ка проецируются в виртуальное адресное пространство процесса, что само по себе не занимает памяти как таковой, поскольку всякая dll-ка загружается системой только один раз. Однако глобальные и
статические данные dll-ки дублируются отдельно для каждого процесса в целях безопасности, что собственно и составляет ~1.5Мб физ. памяти, добавьте еще к этому "кучу" вашей программы(+ стэк + др.) и получите те самые ~1.9Мб.
Но есть одно маленькое НО, в случае если системе понадобяться ресурсы, она сможет освободить физ. память процесса до минимум 200кб(50 страниц), и эта цифра не измениться до тех пор пока вы грубо говоря "не наведете мышку на значок в трее", и даже в этом случае будет 300-400 кб. Это происходит из-за того что страницы с глобальными и статическими данными многих из загруженных библиотек невостребованны и потому система удаляет их из памяти (не в своп, а вообще). И практически оставляет только те с которыми необходимо работать (в вашем случае ntdll.dll, kernel32.dll, user32.dll, msctf.dll и код вашей программы) и только в необходимом объеме.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.005 c