Конференция "KOL" » KOL размер приложения в оперативной памяти
 
  • DonJad © (20.02.09 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 (20.02.09 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 (20.02.09 15:06) [2]
    Кстати, даже эта версия, с "правленными" System и SysInit, занимает в памяти не сильно меньше:
    http://ifolder.ru/10655629
  • D[u]fa (20.02.09 20:15) [3]
    DonJad, честно говоря ерундой маетесь... зачем такой геморой? на какой машине\системе будет работать прога?
  • DonJad © (24.02.09 08:37) [4]
    На большом кол-ве разных по характеристикам. И висеть по тз должна постоянно. Потому и хотелось бы 200-300 кб.

    Может можно принудительно в настройках компилятора отрубить какие-нибудь лишнии библиотеки?
  • DonJad © (24.02.09 08:38) [5]
    тьфу, 50-200 т.е. :)
  • DonJad © (24.02.09 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 (24.02.09 10:12) [7]
    Вот тема про которую я говорил:
    http://pda.delphimaster.net/?id=1205741488&n=10
  • heilong (24.02.09 14:59) [8]
    Каждая dll-ка проецируются в виртуальное адресное пространство процесса, что само по себе не занимает памяти как таковой, поскольку всякая dll-ка загружается системой только один раз. Однако глобальные и
    статические данные dll-ки дублируются отдельно для каждого процесса в целях безопасности, что собственно и составляет ~1.5Мб физ. памяти, добавьте еще к этому "кучу" вашей программы(+ стэк + др.) и получите те самые ~1.9Мб.
    Но есть одно маленькое НО, в случае если системе понадобяться ресурсы, она сможет освободить физ. память процесса до минимум 200кб(50 страниц), и эта цифра не измениться до тех пор пока вы грубо говоря "не наведете мышку на значок в трее", и даже в этом случае будет 300-400 кб. Это происходит из-за того что страницы с глобальными и статическими данными многих из загруженных библиотек невостребованны и потому система удаляет их из памяти (не в своп, а вообще). И практически оставляет только те с которыми необходимо работать (в вашем случае ntdll.dll, kernel32.dll, user32.dll, msctf.dll и код вашей программы) и только в необходимом объеме.
 
Конференция "KOL" » KOL размер приложения в оперативной памяти
Есть новые Нет новых   [134431   +15][b:0][p:0.005]