Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1158567014
dmitry kholl
2006-09-18 12:10
2006.10.29
Бездействие с программой


15-1160362840
Slider007
2006-10-09 07:00
2006.10.29
С днем рождения ! 9 декабря


15-1160481663
vecna
2006-10-10 16:01
2006.10.29
Как в рантайме создать класс...


15-1160393864
лор
2006-10-09 15:37
2006.10.29
радиовещание


2-1160834012
nordic3
2006-10-14 17:53
2006.10.29
Инфа о дисках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский