![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не удаляется из памяти поток MemoryStream [D7, 2003]
alex_sz © (2006-10-05 02:22:00)Фрагмент исходника:
s:=memorystream.create;
//Задаем цикл.
//В цикле сохраняем в поток s картинку SaveToStream(S).
//закрываем цикл.
s.Free;
Набдюдается картина-OutOfMemory! Во время работы цикла идет постоянный прирост загрузки памяти, по не Out.
Подскажите пожалуйста, как освобождать память от потока(или содержимого потока)?
alex_sz (2006-10-06 15:13:00) [21]Грешным делом думаю, что с операционкой какой глюк
alex_sz (2006-10-06 15:09:00) [22]
> ASoft (06.10.06 05:01) [27]
>
> >alex_sz[26]
> и все же, что на самом деле должно происходить после сохранения
> в Pict картинки?
> Что-то здесь не так, ничего не делая далее с Pict, ты его
> уничтожаешь...
> Конечная цель этих манипуляций?
В теле картинка преобразуется из bmp в jpg. Указанный исходник только для прогона.
> Percent (06.10.06 05:09) [28]
>
> P.S. И не говори, что и здесь утечка памяти...
Такая же утечка памяти.Кроме того, каждый раз создавать файл с именем номера записи - в базе их более 2000.
Percent (2006-10-06 05:09:00) [23]
procedure TForm1.Button1Click(Sender: TObject);
var
FS: TFileStream;
BS: TStream;
BM: TBookmark;
Field: TField;
begin
RegDS1.DisableControls;
try
BM := RegDS1.GetBookmark;
try
RegDS1.Last; // Ты уверен, что эта строка нужна?
RegDS1.First;
Field := RegDS1.FieldByName('RPHOTO');
ProgressBar1.Max := RegDS1.RecordCount;
while not RegDS1.Eof do
begin
ProgressBar1.Position := RegDS1.RecNo;
Label1.Caption := IntToStr(RegDS1.RecNo) + ' из ' + IntToStr(RegDS1.RecordCount);
Label1.Repaint;
if not Field.IsNull then
begin
FS := TFileStream.Create('C:\' + IntToStr(RegDS.RecNo), fmOpenWrite);
try
BS := RegDS1.CreateBLOBStream(Field, bmRead);
try
FS.CopyFrom(BS, BS.Size);
finally
BS.Free;
end;
finally
FS.Free;
end;
end;
RegDS1.Next;
end;
RegDS1.GotoBookmark(BM);
finally
RegDS1.FreeBookmark(BM);
end;
finally
RegDS1.EnableControls;
end;
end;
P.S. И не говори, что и здесь утечка памяти...
ASoft (2006-10-06 05:01:00) [24]>alex_sz[26]
и все же, что на самом деле должно происходить после сохранения в Pict картинки?
Что-то здесь не так, ничего не делая далее с Pict, ты его уничтожаешь...
Конечная цель этих манипуляций?
alex_sz (2006-10-06 03:28:00) [25]procedure TForm1.Button1Click(Sender: TObject);
var
Count,CurrentNo: integer;
begin
RegDS1.DisableControls;
RegDS1.Last;
RegDS1.First;
Count:=RegDS1.RecordCount;
CurrentNo:=0;
with RegDS1 do begin
first;
while not eof do
begin
Label1.Caption:=IntToStr(RegDS1.RecNo);
Label1.Refresh;
if RegDS1.FieldByName('RPHOTO').IsNull=false then
begin
Pict:=TFileStream.Create('C:\MyFile.dat',fmOpenReadWrite);
(RegDS1.FieldByName('RPHOTO') as TBlobField).SaveToStream(Pict);
pict.Free;
end;
next;
CurrentNo:=CurrentNo+1;
ProgressBar1.Position:=100 * CurrentNo div Count;
end;
end;
RegDS1.EnableControls;
end;
Компоненты для работы с базой FIBPlus.И больше ничего.
ProgRAMmer Dimonych (2006-10-05 22:39:00) [26]Ого! Может, если исходник не секретный, я его гляну у себя?
alex_sz (2006-10-05 22:21:00) [27]
> ProgRAMmer Dimonych (05.10.06 22:08) [23]
>
> > [18], [19]
> Pict:=TFileStream.Create('C:\MyFile.xxx',<Flags>);
> //Работаем как с обычным Stream
> Pict.Free;
>
> <Flags> - набор флагов (см. VCL справку, объект TFileStream,
> метод Create)...
Абсолютно тоже самое-OutOfMemory
ProgRAMmer Dimonych (2006-10-05 22:08:00) [28]> [18], [19]
Pict:=TFileStream.Create('C:\MyFile.xxx',<Flags>);
//Работаем как с обычным Stream
Pict.Free;
<Flags> - набор флагов (см. VCL справку, объект TFileStream, метод Create)...
alex_sz (2006-10-05 22:05:00) [29]
> medved_68 © (05.10.06 22:00) [20]
>
> alex_sz А если так:
>
> PictStream := TMemoryStream.Create;
> with table do begin
> first;
> while not eof do
> begin
> (table.FieldByName('RPHOTO') as TBlobField).
> SaveToStream (PictStream);
> PictStream.Clear;
> next;
> end;
> end;
> PictStream.Free;
К сожалению до строки PictStream.Free памяти не хватает
alex_sz (2006-10-05 22:02:00) [30]Тупик совсем какой-то
medved_68 (2006-10-05 22:00:00) [31]alex_szА если так:
PictStream := TMemoryStream.Create;
with table do begin
first;
while not eof do
begin
(table.FieldByName('RPHOTO') as TBlobField).SaveToStream (PictStream);
PictStream.Clear;
next;
end;
end;
PictStream.Free;
alex_sz (2006-10-05 20:08:00) [32]Может хоть инфа какая есть?Ищу-не могу найти.Может не вижу.Хэлп дельфи ничего не говорит толкового.Причем схема примера такая же:create - free.
alex_sz (2006-10-05 19:53:00) [33]
> А если FileStream'ом заменить?
Если можно поподробнее.
ProgRAMmer Dimonych (2006-10-05 17:21:00) [34]А если FileStream'ом заменить?
Ketmar (2006-10-05 16:42:00) [35]>[15] Kolan(c) 5-Oct-2006, 13:04
>> next;
>А это что?
переход на следующую запись в таблице, полагаю.
Kolan (2006-10-05 13:04:00) [36]
> next;
А это что?
alex_sz (2006-10-05 12:36:00) [37]Да нет.Обычные bmp-ки 320*200. Причем запускаешь диспетчер задач во время выполнения цикла, очень хорошо видно что расход память на хронографе ровно идет вверх, увеличиваясь с каждой операцией. Ну неужто это такая невыполнимая задача???
Palladin (2006-10-05 12:02:00) [38]ну значит у тебя в базе 2ух гигабайтная картинка
alex_sz (2006-10-05 11:56:00) [39]
> Palladin © (05.10.06 06:29) [11]
>
> это не весь реальный код
Не хватает обьявления переменой PictStream и все. А этот код висит на кнопке в OnClick. Код конечно урезан, но то что в нем удалено ни как не влияет. В этом варианте тоже самое.
Palladin (2006-10-05 06:29:00) [40]это не весь реальный код