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

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

Не удаляется из памяти поток MemoryStream [D7, 2003]


Страницы:   1 2 3

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]

это не весь реальный код


Страницы:   1 2 3

Наверх

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