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

Вниз

TMemoryStream и расход памяти   Найти похожие ветки 

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

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

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) и потом заполняется видоизменённой информацией, двоичной, и первого МемСтрима. Но почему-то с каждым разом работа этой процедуры замедлялась, а разе на десятом - вообще вывело сообщение о том, что не хватает памяти. В чём может быть прикол?


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

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

убери var


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

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


 
Eraser ©   (2006-10-29 16:03) [3]

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

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

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

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


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

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


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

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

приведи код DoSomething


 
Eraser ©   (2006-10-29 16:06) [6]

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

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


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

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;


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

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


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

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


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

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

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


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

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


 
Anatoly Podgoretsky ©   (2006-10-29 17:19) [12]

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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.083 c
2-1162109258
Pazitron_Brain
2006-10-29 11:07
2006.11.12
Перевод Dec-->Bin и обратно


1-1159106424
fs_more
2006-09-24 18:00
2006.11.12
Передача данных в сообщении (SendMessage / PostMessage)


2-1162024745
Ivolg
2006-10-28 12:39
2006.11.12
Замена букв


2-1162032308
TIF
2006-10-28 14:45
2006.11.12
Как создать файл в Program Files?


15-1161415275
Гарри Поттер
2006-10-21 11:21
2006.11.12
Анимация "пожалуйста ждите"