Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.003 c
15-1301492829
young_dev
2011-03-30 17:47
2011.07.17
большие процедуры/функции


2-1302079269
Максон
2011-04-06 12:41
2011.07.17
проблема со Stringgrid


13-1126787622
MeF Dei Corvi
2005-09-15 16:33
2011.07.17
Порядок создания статических классов


15-1300669083
Германн
2011-03-21 03:58
2011.07.17
Ищу что-то типа SVN, но не для разработчиков, а для тестировщиков


15-1302018111
И. Павел
2011-04-05 19:41
2011.07.17
Ищу роман С. Кинга "Под куполом"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский