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

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

TMemoryStream и расход памяти


Проггер из библиотеки ©   (2006-10-29 15:45:00) 

Вчера писал такое:

procedure TForm1.Button1Click(Sender:TObject);
var
InFile,OutFile:TMemoryStream;
begin
Infile:=TMemoryStream.Create;
OutFile:=TMemoryStream.Create;
InFile.LoadFromFile('<Здесь была переменная с именем файла, полученным изи TOpenDialog>');
DoSomething(InFile,OutFile);
DoSomething(OutFile,InFile);
{Дальше в качестве эксперимента последние две строки повторялись несколько раз}
{Обработка результатов}
Infile.Free; OutFile.Free;
end;

DoSomething - процедура, первый параметр - const, второй - var, т.е. возвращаемый. Второй MemoryStream в этой процедуре очищается (MemStream.Clear) и потом заполняется видоизменённой информацией, двоичной, и первого МемСтрима. Но почему-то с каждым разом работа этой процедуры замедлялась, а разе на десятом - вообще вывело сообщение о том, что не хватает памяти. В чём может быть прикол?


Anatoly Podgoretsky   (2006-10-29 17:19:00) [1]

> Ответ на сообщение [9]

Основание, защитных блоков нет.


MetalFan_pda   (2006-10-29 16:58:00) [2]

как определил утечку памяти? приведенный код не должен кушать лишнее->косяк в другом месте...


Проггер из библиотеки   (2006-10-29 16:52:00) [3]

Мастера, ещё идеи есть?

Как вообще можно стримами обрабатывать большие объёмы информации?


Проггер из библиотеки   (2006-10-29 16:28:00) [4]

Да, но это и не могло быть проблемой: там нет никаких Exit'ов и т.п.


Орион   (2006-10-29 16:26:00) [5]

о! а строка Infile.Free; OutFile.Free;точно исполняется?


Проггер из библиотеки   (2006-10-29 16:10:00) [6]

procedure TMyComponent.DoSomething(const InStream:TMemoryStream; var OutStream:TMemoryStream);
var
Tmp:aarray [1..8] of Byte;
begin
OutStream.Clear; InStream.Position:=0;
while InStream.Position+8<=InStream.Size do
begin
 InStream.Read(Tmp,8);
 {Дальше обрабатываем содержимое Tmp, на выходе - не более 9 байт, которые сразу записываем в OutStream}
end;
{Последние необработанные байты, если таковые остались - просто добавляем в OutStream}
end;


Eraser   (2006-10-29 16:06:00) [7]

> [4] Проггер из библиотеки   (29.10.06 16:03)

в данном случае - ничего )


Орион   (2006-10-29 16:05:00) [8]

> [4] Проггер из библиотеки   (29.10.06 16:03)

приведи код DoSomething


Eraser   (2006-10-29 16:03:00) [9]

> [1] Орион ©   (29.10.06 15:55)

только это ничего не даст )

> [2] Проггер из библиотеки   (29.10.06 15:56)

конечно, идентификатор объекта это только указатель.


Проггер из библиотеки   (2006-10-29 16:03:00) [10]

> [3]
А что может дать?


Проггер из библиотеки   (2006-10-29 15:56:00) [11]

Он же всё равно будет возвращать изменённым?


Орион   (2006-10-29 15:55:00) [12]

> процедура, первый параметр - const, второй - var, т.е. возвращаемый.

убери var


Наверх

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