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

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

Утечка памяти [WinXP]


Alik ©   (2009-12-02 20:38:00) 

В моей программе идет периодическая перерисовка двух объектов типа TCanvas.
Наблюдая за ОЗУ видно, как оно медленно, но верно уменьшается.

Стоит свернуть окошко программы как объем незанятого ОЗУ возвращается в первоначальное состояние.

При развертывании окошка ОЗУ снова пожирается!

Я в шоке! ))


Amoeba   (2009-12-11 22:07:00) [1]

1.
> procedure TF_Radar.Adjust_PPI( Image: PImage ; PPILabel: TLabel; Flag: Boolean);
const dCircle = 1;
begin
with Image^ , Canvas do begin

А эта хрень - указатель на указатель - нафига (объектную модель Delphi хоть знаете?)? Не надо так делать! Можно хорошо получить граблями по лбу.

В остальном же в пределах представленного кода ничего, что может вызвать утечки памяти, не видно.

2.
> Наблюдая за ОЗУ видно, как оно медленно, но верно уменьшается.
>
> Стоит свернуть окошко программы как объем незанятого ОЗУ
> возвращается в первоначальное состояние.
>
> При развертывании окошка ОЗУ снова пожирается!

Таким путем утечки памяти не диагностируются. Для этого используетсяспециальный инструментарий: MemProof, FastMM.


Alik   (2009-12-11 21:16:00) [2]


> clickmaker ©   (03.12.09 11:29) [6]
> > идет периодическая перерисовка двух объектов типа TCanvas
>
> как именно? что используется: Pen, Brush, Bitmap...?


В качестве ответа на вопрос привожу кусок программы.
DrawPPIRay используется примерно 5 раз в секунду, Adjust_PPI примерно 5 раз раз минуту.

procedure TF_Radar.DrawPPIRay;
var
 X1, Y1, Ri: Integer;
 aRefl: TColor;
 aRealAz: Single;
begin
 with RadarStatus, PPI do begin
      Label_Az.Caption := IntToStr(Trunc(RealAz))          + '°';
      Label_Q.Caption  := FloatToStr( Round(RealQ*10)/10 ) + '°';

      if Anod1 or (Calibration and (StringGrid_Calibrovka.Col = 1)) then
      with Image_3cm, Canvas do begin
           Brush.Style := bsClear;
           Pen.Color := clBlack;
           Pen.Width := 1;
           Pen.Mode  := pmNotXor;
           MoveTo( X0, Y0 );
           LineTo( X2, Y2 );
           end;
      X2 := X0 + round( NR * sin(RealAz*Pi180) );
      Y2 := Y0 - round( NR * cos(RealAz*Pi180) );
      if Anod1 or (Calibration and (StringGrid_Calibrovka.Col = 1)) then
         with Image_3cm.Canvas do begin
              MoveTo( X0, Y0 ); LineTo( X2, Y2 );
              end;
      //------draw PPI rays---------------------------
      Image_3cm.Canvas.Pen.Mode  := pmCopy;
      with FileObzora do
           for Ri := 1 to NR - 5 do begin
               aRealAz := RealAz - 2;
               if aRealAz < 0 then Exit;
               X1 := X0 + round( Ri * sin(aRealAz*Pi180) );
               Y1 := Y0 - round( Ri * cos(aRealAz*Pi180) );

               if Anod1 or (Calibration and (StringGrid_Calibrovka.Col = 1)) then   begin
                  aRefl := trunc( FileObzoraCh1[CurQ, CurAz, Ri*dR-1] / 14);
                  if aRefl > Colors16 then aRefl := Colors16;
                  if (aRefl > 1) and (Anod1 or Calibration) then
                     Image_3cm.Canvas.Pixels[ X1, Y1 ] := ArrColors16[aRefl];
                  end;
               end;
      end;
end;

procedure TF_Radar.Adjust_PPI(Image: PImage; PPILabel: TLabel; Flag: Boolean);
const dCircle = 1;
begin
 with Image^, Canvas do begin
      Pen.Width   := dCircle;
      Brush.Style := bsSolid;
      if not Flag then begin
         Pen.Color := RGB(150,150,150);
         Brush.Color := ToolBar1.Color;
         FillRect(ClipRect);
         Arc(0, 0, ClientWidth, ClientHeight, ClientWidth - 10, 0, 0, ClientHeight );
         Pen.Color := clWhite;
         Arc(0, 0, ClientWidth, ClientHeight, 10, ClientHeight, ClientWidth, 0 );
         PPILabel.Visible := True;
         end
      else begin
         PPILabel.Visible := False;
         Pen.Color   := clWhite;
         Brush.Color := clWhite;
         Ellipse(dCircle, dCircle, ClientWidth - dCircle, ClientHeight - dCircle);
         end;
      end;
end;


Б   (2009-12-03 16:15:00) [3]

Наверное не удаляются вовремя GDI'ишные H-объекты.


clickmaker   (2009-12-03 11:29:00) [4]

> идет периодическая перерисовка двух объектов типа TCanvas

как именно? что используется: Pen, Brush, Bitmap...?


Anatoly Podgoretsky   (2009-12-03 08:54:00) [5]

Пока описано нормальное поведение программы.


MBo   (2009-12-03 08:02:00) [6]

Не факт, то это действительно утечка. Менеджер памяти не обязан освобождать память немедленно.
Так что лучше проверить более серьезными средствами (от ReportMemoryLeaksOnShutdown менеджера памяти  в свежих версиях Дельфи до профайлеров, если что-то и правда не в порядке)


Leonid Troyanovsky   (2009-12-02 23:39:00) [7]


> Alik   (02.12.09 20:38)  

\system32\perfmon.exe
forever.

--
Regards, LVT.


Rouse_   (2009-12-02 22:26:00) [8]


> Наблюдая за ОЗУ видно, как оно медленно, но верно уменьшается.

Сие называется мемлик. А сворачивание экрана, просто скидывает в ноль ProcessWorkSetSize из-за чего тебе кажется что как будто память "освободилась"


Сергей М.   (2009-12-02 21:23:00) [9]


> Наблюдая за ОЗУ


Вот зачем врать, а ?


> Я в шоке


Твоё фамилиё случаем не Зверев ?)


Наверх

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