Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.17;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2011.07.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
11-1235129408
DonJad
2009-02-20 14:30
2011.07.17
KOL размер приложения в оперативной памяти


15-1302072937
Scott Storch
2011-04-06 10:55
2011.07.17
tortoise svn


2-1302413666
snake-as
2011-04-10 09:34
2011.07.17
При запуске второй копии программы восстанавливать из трея первую


15-1301996213
zoolooz
2011-04-05 13:36
2011.07.17
Преобразование диапазонов


1-1258987492
Diplomat
2009-11-23 17:44
2011.07.17
Удалить сведения об ранее подключенных устройствах