Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизНе удаляется из памяти поток MemoryStream Найти похожие ветки
← →
alex_sz (2006-10-05 02:22) [0]Фрагмент исходника:
s:=memorystream.create;
//Задаем цикл.
//В цикле сохраняем в поток s картинку SaveToStream(S).
//закрываем цикл.
s.Free;
Набдюдается картина-OutOfMemory! Во время работы цикла идет постоянный прирост загрузки памяти, по не Out.
Подскажите пожалуйста, как освобождать память от потока(или содержимого потока)?
← →
Ketmar © (2006-10-05 02:40) [1]ну а чего ты хотел? если ты постоянно пишешь в memory stream, натурально, этот стрим жрёт всё больше memory. %-)
← →
alex_sz (2006-10-05 02:46) [2]А не подскажите как грамотнее это реализовать?
← →
Джо © (2006-10-05 02:48) [3]> [2] alex_sz (05.10.06 02:46)
> А не подскажите как грамотнее это реализовать
Что реализовать-то?
← →
alex_sz (2006-10-05 02:51) [4]Запись в поток без перегрузки памяти
← →
Джо © (2006-10-05 03:04) [5]> [4] alex_sz (05.10.06 02:51)
> Запись в поток без перегрузки памяти
При чем здесь "перегрузка памяти"? Ты пишешь в память, разумеется, растет ее использование.
← →
alex_sz (2006-10-05 03:06) [6]Но веть я потом ее стираю. Пробовал и free и destroy - все равно перегружается.
← →
Германн © (2006-10-05 03:11) [7]
> alex_sz (05.10.06 02:51) [4]
>
> Запись в поток без перегрузки памяти
>
И вот опять яркий пример неумения задать правильный вопрос. Р.Шэкли идёт на север! :-)
<Telepator on>
//Задаем цикл.
s:=memorystream.create;
//В цикле сохраняем в поток s картинку SaveToStream(S).
s.Free;
//закрываем цикл.
<Telepator off>
← →
alex_sz (2006-10-05 03:16) [8]
> //Задаем цикл.
> s:=memorystream.create;
> //В цикле сохраняем в поток s картинку SaveToStream(S).
>
> s.Free;
> //закрываем цикл.
Тоже самое - OutOfMemory
← →
Германн © (2006-10-05 03:37) [9]
> alex_sz (05.10.06 03:16) [8]
>
>
> > //Задаем цикл.
> > s:=memorystream.create;
> > //В цикле сохраняем в поток s картинку SaveToStream(S).
>
> >
> > s.Free;
> > //закрываем цикл.
>
>
> Тоже самое - OutOfMemory
>
Ну тогда приведи наконец реальный код, который даёт ошибку!
Ну сколько же можно нам тут "телепатировать"?!
← →
alex_sz (2006-10-05 03:45) [10]with table do begin
first;
while not eof do
begin
PictStream := TMemoryStream.Create;
(table.FieldByName("RPHOTO") as TBlobField).SaveToStream(PictStream);
PictStream.Free;
next;
end;
end;
← →
Palladin © (2006-10-05 06:29) [11]это не весь реальный код
← →
alex_sz (2006-10-05 11:56) [12]
> Palladin © (05.10.06 06:29) [11]
>
> это не весь реальный код
Не хватает обьявления переменой PictStream и все. А этот код висит на кнопке в OnClick. Код конечно урезан, но то что в нем удалено ни как не влияет. В этом варианте тоже самое.
← →
Palladin © (2006-10-05 12:02) [13]ну значит у тебя в базе 2ух гигабайтная картинка
← →
alex_sz (2006-10-05 12:36) [14]Да нет.Обычные bmp-ки 320*200. Причем запускаешь диспетчер задач во время выполнения цикла, очень хорошо видно что расход память на хронографе ровно идет вверх, увеличиваясь с каждой операцией. Ну неужто это такая невыполнимая задача???
← →
Kolan © (2006-10-05 13:04) [15]
> next;
А это что?
← →
Ketmar © (2006-10-05 16:42) [16]>[15] Kolan(c) 5-Oct-2006, 13:04
>> next;
>А это что?
переход на следующую запись в таблице, полагаю.
← →
ProgRAMmer Dimonych (2006-10-05 17:21) [17]А если FileStream"ом заменить?
← →
alex_sz (2006-10-05 19:53) [18]
> А если FileStream"ом заменить?
Если можно поподробнее.
← →
alex_sz (2006-10-05 20:08) [19]Может хоть инфа какая есть?Ищу-не могу найти.Может не вижу.Хэлп дельфи ничего не говорит толкового.Причем схема примера такая же:create - free.
← →
medved_68 © (2006-10-05 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;
← →
alex_sz (2006-10-05 22:02) [21]Тупик совсем какой-то
← →
alex_sz (2006-10-05 22:05) [22]
> 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 памяти не хватает
← →
ProgRAMmer Dimonych (2006-10-05 22:08) [23]> [18], [19]
Pict:=TFileStream.Create("C:\MyFile.xxx",<Flags>);
//Работаем как с обычным Stream
Pict.Free;
<Flags> - набор флагов (см. VCL справку, объект TFileStream, метод Create)...
← →
alex_sz (2006-10-05 22:21) [24]
> 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:39) [25]Ого! Может, если исходник не секретный, я его гляну у себя?
← →
alex_sz (2006-10-06 03:28) [26]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.И больше ничего.
← →
ASoft (2006-10-06 05:01) [27]>alex_sz[26]
и все же, что на самом деле должно происходить после сохранения в Pict картинки?
Что-то здесь не так, ничего не делая далее с Pict, ты его уничтожаешь...
Конечная цель этих манипуляций?
← →
Percent (2006-10-06 05:09) [28]
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. И не говори, что и здесь утечка памяти...
← →
alex_sz (2006-10-06 15:09) [29]
> ASoft (06.10.06 05:01) [27]
>
> >alex_sz[26]
> и все же, что на самом деле должно происходить после сохранения
> в Pict картинки?
> Что-то здесь не так, ничего не делая далее с Pict, ты его
> уничтожаешь...
> Конечная цель этих манипуляций?
В теле картинка преобразуется из bmp в jpg. Указанный исходник только для прогона.
> Percent (06.10.06 05:09) [28]
>
> P.S. И не говори, что и здесь утечка памяти...
Такая же утечка памяти.Кроме того, каждый раз создавать файл с именем номера записи - в базе их более 2000.
← →
alex_sz (2006-10-06 15:13) [30]Грешным делом думаю, что с операционкой какой глюк
← →
ProgRAMmer Dimonych (2006-10-06 17:59) [31]Антивирус что говорит?
← →
alex_sz (2006-10-06 20:21) [32]
> Антивирус что говорит?
Молчит собака.Спайварами всякими смотрел-чисто.Недавно ставил оптимизатор памяти.Может он чего напартачил
← →
ProgRAMmer Dimonych (2006-10-07 01:46) [33]Так, оптимизатор удаляем... Смотрим...
← →
Loginov Dmitry © (2006-10-07 09:09) [34]Percent (06.10.06 5:09) [28]
RegDS1.Last; // Ты уверен, что эта строка нужна?
А почему нет? Обычно ставлю строку в обработчик AfterOpen при открытии справочных таблиц, подставляемых в списки Lookup (это относится к базам данных InterBase). Если используются компоненты FibPlus, то возможно, что и в них тот же глюк, что и в IB Express (некорректно работает свойство RecordCount)
← →
Percent (2006-10-07 09:23) [35]Loginov Dmitry © (07.10.06 09:09) [34]
...возможно, что и в них тот же глюк, что и в IB Express...
Поэтому и акцентировал внимание...
← →
alex_sz (2006-10-08 23:23) [36]Дурдом какой-то. Пробовал на других машинах-таже ***ня!Память умирает.На втором своем компе с гигом озу количество операций не доходит до перегрузки.Тем не менее, загруз памяти остается до тех пор, пока не вырубишь прогу.ХЭЛП!!!
← →
ProgRAMmer Dimonych © (2006-10-08 23:34) [37]Может, скинь куда-нибудь исходники, мы глянем на месте, в оффлайне, спокойно.
А вообще как с отладчиком? Чё он говорит?
← →
ProgRAMmer Dimonych © (2006-10-08 23:35) [38]И откуда увереность в том, что жрёт ОЗУ именно этот кусок проги?
← →
Vovan#1 (2006-10-08 23:41) [39]Какая Делфя?
← →
alex_sz (2006-10-08 23:57) [40]Экспереметировал, гонял просто pict.create - pict.free.Ничего в поток не записывал - все нормально.Ну вроде логично- поток пустой и прироста нет.
А исходник практически весь здесь -> [26], акромя процедуры fileopen.Его и гоняю.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 5.283 c