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

Вниз

Программа "ест" память, потом сбой   Найти похожие ветки 

 
Pcrepair ©   (2011-06-30 17:58) [0]

Добрый день
Программа была написана для проверки работоспособности процедур компресии-декомпресии графического файла с использованием Zlib в Делфи2010

unit main;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls, Zlib;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Image1: TImage;
   procedure Button1Click(Sender: TObject);
   procedure Compress;
   procedure DCompress;
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
 pic1: TMemoryStream;
 pic2: TMemoryStream;
 pic3: TMemoryStream;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //при нажатии на кнопку
begin
 if FileExists(ExtractFilePath(Application.ExeName)+"\"+"s1.bmp") then
         DeleteFile(ExtractFilePath(Application.ExeName)+"\"+"s1.bmp");//удаляется файл
 pic1 := TMemoryStream.create;//создаются потоки
 pic2 := TMemoryStream.create;
 pic3 := TMemoryStream.create;
 pic1.LoadFromFile(ExtractFilePath(Application.ExeName)+"\"+"s.bmp");//в поток загружается файл с диска
 Compress;//файл сжимается  и передается в ПЕРЕМ pic2
 DCompress;//файл декомпрессируется и передается в pic3
 pic3.SaveToFile(ExtractFilePath(Application.ExeName)+"\"+"s1.bmp");//файл сохраняется на диск
 Image1.Picture.bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+"\"+"s1.bmp");//файл отображается в окне, для контроля

 pic1.Free;//уничтожение ПЕРЕМ
 pic2.Free;
 pic3.Free;

 end;

procedure TForm1.Compress;//процедура сжатия, не мое
var
 TmpStream : TMemoryStream;
 CmpStream : TCompressionStream;
begin
 TmpStream := TMemoryStream.Create;
 CmpStream := TCompressionStream.Create (clMax, TmpStream);
// application.ProcessMessages;
 pic1.Seek (0, 0);
 CmpStream.CopyFrom (pic1, pic1.Size);
 CmpStream.Free;
//  FCompressionRate := 100 - TmpStream.Size / _in.Size * 100;
 TmpStream.Position:=0;
 pic2.Position:=0;
 pic2.SetSize(TmpStream.Size);
 pic2.CopyFrom (TmpStream, TmpStream.Size);
 TmpStream.Free;
end;

procedure TForm1.DCompress;// процедура декомпресии, не мое
const
 BufSize = 1024;
var
 Buf : pointer;
 Readed : Integer;
 FDecompressedStream:TMemoryStream;
 DecompStream : TDecompressionStream;
begin
     pic2.Seek (0, 0);
       DecompStream := TDecompressionStream.Create(pic2);
       try
           FDecompressedStream := TMemoryStream.Create;
           GetMem (Buf, BufSize);
           try
             repeat
               Readed := DecompStream.read (Buf^, BufSize);
               if Readed > 0
                 then FDecompressedStream.Write (Buf^, Readed);
             until Readed <= 0;
           finally
             FreeMem (Buf, BufSize);
           end;
       finally
         DecompStream.Free;
       end;
       FDecompressedStream.Seek (0, 0);
       pic3.Seek (0, 0);
       pic3.CopyFrom(FDecompressedStream, FDecompressedStream.Size);
end;
end.


В общем программа работает, но при каждом нажатии на кнопку отбирает все больше памяти(4-12-20- и далее мб)
Все Переменные после использования уничтожаются
В чем может быть проблема?


 
Ega23 ©   (2011-06-30 18:45) [1]


> В чем может быть проблема?


В процедуре DCompress утечка памяти. Это то, что "блондинка" сходу увидела.
Но подсказывать не буду. Из принципа. :)
Не из вредности, а потому, что ты её должен найти сам.


 
Pcrepair ©   (2011-06-30 19:06) [2]

да че тут искать?
       FDecompressedStream.Free;


 
Ega23 ©   (2011-06-30 19:43) [3]

Ну вот видишь, всё просто.

З.Ы. Код - ужасен.


 
Ega23 ©   (2011-06-30 19:59) [4]

Несколько советов по улучшению кода:
1. Используй ZCompress и ZDecompress. В стримах под D2010 есть косяк, я уже раньше писал.
2. В данном примере можно обойтись одним стримом, вместо трёх. Просто добавь в свои методы Compress и Decompress параметр Stream: TMemoryStream
3. Используй Stream.ReadBuffer и Stream.WriteBuffer.
4. Пользуйся конструкцией:
 obj := TSomeObject.Create;
 try
   /// Работа с obj
 finally
   obj.Free;
 end;


 
Pcrepair ©   (2011-06-30 21:09) [5]

и чем канкретна код ужасен?


 
Ega23 ©   (2011-06-30 21:44) [6]


> и чем канкретна код ужасен?


Ну например:
1. В событии OnFormCreate пропиши ReportMemoryLeaksOnShutdown := True;
2. Переименуй файл s.bmp в _s.bmp.
3. Запусти приложение
4. Нажми на кнопку
5. Прочитай ExceptionMessage
6. Штатно закрой приложение (не через Program Reset)
7. Промедитируй над сообщением, которое вывалится.


 
antonn ©   (2011-07-01 00:02) [7]


> procedure TForm1.DCompress;// процедура декомпресии, не
> мое

а чье?


 
Pcrepair ©   (2011-07-01 08:20) [8]

не узнаешь свой код?
это по твоей наводке из файла p_u.pas


 
Ega23 ©   (2011-07-01 10:25) [9]


procedure CompressStream(Stream: TMemoryStream);
var
 pOut: Pointer;
 outSize: Integer;
begin
 ZCompress(Stream.Memory, Stream.Size, pOut, outSize, zcMax);
 try
   Stream.Position := 0;
   Stream.WriteBuffer(pOut^, outSize);
 finally
   FreeMem(pOut);
 end;
end;

procedure DecompressStream(Stream: TMemoryStream);
var
 pOut: Pointer;
 outSize: Integer;
begin
 ZDecompress(Stream.Memory, Stream.Size, pOut, outSize);
 try
   Stream.Position := 0;
   Stream.WriteBuffer(pOut^, outSize);
 finally
   FreeMem(pOut);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 ms: TMemoryStream;
 appDir: string;
begin
 ms := TMemoryStream.Create;
 try
   appDir := ExtractFilePath(ParamStr(0));
   ms.LoadFromFile(appDir+"s.bmp");
   CompressStream(ms);
   DecompressStream(ms);
   ms.Position := 0;
   Image1.Picture.bitmap.LoadfromStream(ms);
 finally
   ms.Free;
 end;
end;


Как же мне это всё надоело... Забаньте на месяц, что-ли?


 
Anatoly Podgoretsky ©   (2011-07-01 11:41) [10]

> Ega23  (01.07.2011 10:25:09)  [9]

Уверен?


 
antonn ©   (2011-07-01 13:18) [11]


> не узнаешь свой код?
> это по твоей наводке из файла p_u.pas

тогда по той же наводке попробуй использовать UnPack_Memory(var _in:TMemoryStream);, а не это нагромождение


 
Dennis I. Komarov ©   (2011-07-01 13:25) [12]


> Уверен?

Да ладно, пятницу тяжко переживает поди...
дня на три :)


 
Pcrepair ©   (2011-07-01 16:05) [13]

будем пробовать


 
Игорь Шевченко ©   (2011-07-01 16:37) [14]

Ega23 ©   (01.07.11 10:25) [9]

Небольшая коррекция кода в [9]: строки

  Stream.Position := 0;

следует заменить на

  Stream.Clear;

(от автора [9])


 
antonn ©   (2011-07-01 16:47) [15]

а чего - Ega забанили? я думал он об авторе говорил :))


 
Игорь Шевченко ©   (2011-07-01 16:57) [16]


> а чего - Ega забанили?


а чего, правила читать - не судьба ? :)
Забанили.


 
Pcrepair ©   (2011-07-01 20:29) [17]

Ega23, на самом деле работает это:

var
 Form1: TForm1;
 Stream: TMemoryStream;

implementation

{$R *.dfm}

procedure TForm1.CompressStream();
var
pOut: Pointer;
outSize: Integer;
begin
ZCompress(Stream.Memory, Stream.Size, pOut, outSize, zcMax);
try
 Stream.Clear;
 Stream.WriteBuffer(pOut^, outSize);
 finally
  FreeMem(pOut);
end;
end;

procedure TForm1.DecompressStream;
var
pOut: Pointer;
outSize: Integer;
begin
ZDecompress(Stream.Memory, Stream.Size, pOut, outSize);
try
    Stream.Clear;
  Stream.WriteBuffer(pOut^, outSize);
finally
  FreeMem(pOut);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
appDir: string;
begin
Stream := TMemoryStream.Create;
try
  appDir := ExtractFilePath(ParamStr(0));
  Stream.LoadFromFile(appDir+"s.bmp");
  CompressStream;
  DecompressStream;
  Stream.Position := 0;
  Image1.Picture.bitmap.LoadfromStream(Stream);
finally
  Stream.Free;
end;
end;

end.

но особой разницы в потреблении памяти практически нет
так что до сих пор неясно чем твой метод лучше предыдущего



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

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

Наверх




Память: 0.52 MB
Время: 0.009 c
2-1308682465
antonn
2011-06-21 22:54
2011.10.16
Сменить ресурс в EXE


8-1205914978
Franzy
2008-03-19 11:22
2011.10.16
OpenGL - как сделать "скриншот"?


2-1309002914
Тимофей Ю.
2011-06-25 15:55
2011.10.16
неправильно выбран тип числа


2-1308936747
vegarulez
2011-06-24 21:32
2011.10.16
как правильно вставить декларацию процедуры?


2-1309343844
bon
2011-06-29 14:37
2011.10.16
delphi &amp; c#