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

Вниз

Утечка памяти   Найти похожие ветки 

 
Alik   (2009-12-02 20:38) [0]

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

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

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

Я в шоке! ))


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


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


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


> Я в шоке


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


 
Rouse_ ©   (2009-12-02 22:26) [2]


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

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


 
Leonid Troyanovsky ©   (2009-12-02 23:39) [3]


> Alik   (02.12.09 20:38)  

\system32\perfmon.exe
forever.

--
Regards, LVT.


 
MBo ©   (2009-12-03 08:02) [4]

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


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

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


 
clickmaker ©   (2009-12-03 11:29) [6]

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

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


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

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


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


> 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;


 
Amoeba ©   (2009-12-11 22:07) [9]

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.



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1260503262
depot
2009-12-11 06:47
2010.02.07
использование TAction


1-1236890859
Tatarin
2009-03-12 23:47
2010.02.07
Спецсимволы HTML


15-1259754434
12
2009-12-02 14:47
2010.02.07
Переписал триггер SQL2000. Что не так то?


1-1237151847
demon
2009-03-16 00:17
2010.02.07
Как перехватить запуск нового приложения?


15-1259875013
AlexDan
2009-12-04 00:16
2010.02.07
Стиль W7 и стандартные компоненты..