Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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...а насколько я помню, эти библы, еще "тянут" за собой "кучу" всего...


Наверх

Титульная страница Поиск, карта сайта Написать письмо