Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Отчего программа занимает столько памяти?


Автор: Pavelbej 25.8.2006, 23:52
Сделал программу на Делфи, работает все время пока комп включен. Программа вроде маленькая но занимает огромную память аж до 14 Мб. Отчего это? Если не правильно задал вопрос, не пинайте сильно.

Автор: bems 26.8.2006, 01:07
14cтр

Добавлено @ 01:07 
Подкл. модуля?

Автор: Palladin 26.8.2006, 02:52
Юзай поиск по форуму вопрос был smile 
P.S. Это по большей части из-за того что в стандартный проект делфи входит уйма ненужных(для данной программы) функций(а это тысячи строк кода)....нужно просто поотключать те модули которые ты не юзаеш smile 

Автор: Snowy 26.8.2006, 10:28
Но ведь не 14Мб! Ладно 1.4Мб, но не 14...
Значит подо что-то сам же и занял.
А может где-то утекает.
Гадать невозможно.

Автор: Palladin 27.8.2006, 00:29
Цитата(Snowy @  26.8.2006,  10:28 Найти цитируемый пост)
Но ведь не 14Мб! Ладно 1.4Мб, но не 14...

Да я не говорю про стандартные модули, может у него в программе нужно было вызвать множество модулей, а использовал из каждого по паре функций к примеру, вот по этому 14 метров smile хотя чтобы 14 метров было, нужно ,наверное, все модули подключить smile 

Может ты там сам какието процедуры писал smile может они кривые, и из-за них морозит smile 

P.S. Но как сказал Showy кадать бессмысленно, покажи весь юнит, может тогда станет понятно smile 

Автор: Snowy 27.8.2006, 08:38
RooR, лишние модули влияют на размер программы, а не на память.
А у человека программа маленькая.
Так что не видя кода, сказать сложно в чём проблема.
Мои телепатические способности не действуют. Видимо не знаю в какую сторону телепатировать smile

Автор: Тьма 27.8.2006, 09:51
Хорошо, а если прогармма на АПИ и на винте занимает 40 кб, а в памяти 1.5 метра? почему так? подгружает системные ДЛЛ?
(все хотел задать это т вопрос на форуме, но забывал)

Автор: Sunvas 27.8.2006, 12:47
Цитата(Тьма @  27.8.2006,  09:51 Найти цитируемый пост)
Хорошо, а если прогармма на АПИ и на винте занимает 40 кб, а в памяти 1.5 метра? почему так? подгружает системные ДЛЛ?

Да. Именно так обычно и бывает. Но, как говорил, Snowy:

Цитата(Snowy @  26.8.2006,  10:28 Найти цитируемый пост)
А может где-то утекает.
Гадать невозможно.


Автор: dumb 27.8.2006, 13:11
Тьма, смотри http://forum.vingrad.ru/index.php?showtopic=107307

Автор: Тьма 27.8.2006, 13:15
спасибо

Автор: Pavelbej 28.8.2006, 14:38
Вот тут, чем больше загружаемая картинка тем больше памяти занимает программа, доходило аж до 30 МБ. Наверное чтото тут не правильно.
Код

procedure TForm1.ListBox1Click(Sender: TObject);
var
  f : TFileStream;
  w, h, ww : word;
  Exte : shortstring;
  b1, b2 : Byte;
begin
      Image1.Picture.LoadFromFile(ListBox1.Items[ListBox1.itemindex]);
      Exte := LowerCase(ExtractFileExt(ListBox1.Items[ListBox1.itemindex]));
      if (Exte = '.bmp') then
        begin
         try
          f := TFileStream.Create(ListBox1.Items[ListBox1.itemindex], fmOpenRead or fmShareDenyWrite);
          f.Seek(18, soFromBeginning);
          f.ReadBuffer(w, SizeOf(w));
          f.ReadBuffer(h, SizeOf(h));
         finally
          f.Free;
         end;
        end;
      if (Exte='.jpg') or (Exte='.jpeg') then
        begin
          try
          f := TFileStream.Create(ListBox1.Items[ListBox1.itemindex], fmOpenRead or fmShareDenyWrite);
          f.Seek(2, soBeginning);
          ww := 2;
          repeat
          f.Seek(ww - 2, soFromCurrent);
          f.ReadBuffer(b1, 1);
          f.ReadBuffer(b2, 1);
          if (b1 <> $FF) or (b2 = $00) or (b2 = $FF)
          then
            Begin
              repeat
                f.Position := f.Position - 1;
                f.ReadBuffer(b1, 1);
                f.ReadBuffer(b2, 1);
              until ((f.Position + 2) > f.Size) or
                    ((b1 = $FF) and (b2 <> $00) and (b2 <> $FF));
              if (f.Position + 2) > f.Size
              then
                Break
            end;
          f.ReadBuffer(ww, 2);
          ww := SwapWord(ww);
       until ((b1 = $FF) and (b2 in [$C0, $C1, $C2])) or ((f.Position + ww + 4) > f.Size);
       f.Seek(1, soFromCurrent);
       f.ReadBuffer(h, 2);
       f.ReadBuffer(w, 2);
       h := SwapWord(h);
       w := SwapWord(w);
          finally
           f.Free;
           end;
    end;

     Label5.Caption := 'Name: '+ExtractFileName (ListBox1.Items[ListBox1.itemindex]);
     Label3.Caption := 'Resolution: '+InttoStr(w)+' x '+inttostr(h);
     Label1.Caption:= format('Size: %0.1f КB', [GetFileSizeByName(ListBox1.Items[ListBox1.itemindex])/1024]);
end;

Автор: Alexeis 28.8.2006, 15:15
ну если BMPшка весит 30мб, то строка
Код

   Image1.Picture.LoadFromFile(ListBox1.Items[ListBox1.itemindex]);

благополучно их выделит

Автор: Pavelbej 28.8.2006, 16:08
alexeis1,  файлы максимум были на 1 МБ.

Автор: Alexeis 28.8.2006, 16:14
  Но в чем был смысл искать ширину и высоту загруженой картинки, когда она уже загружена? Этот способ я писал для быстрого получения параметров картинки без ее загрузки в память! 
Тут же проще было 
Код

 Image1.Picture.height
 Image1.Picture.Width

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)