![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти [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]
> Наблюдая за ОЗУ
Вот зачем врать, а ?
> Я в шоке
Твоё фамилиё случаем не Зверев ?)