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

Вниз

TMemoryStream - копировать, сохранить   Найти похожие ветки 

 
Evgenyy   (2007-12-10 09:09) [0]

надо из класса скопировать в локальные переменные

var
N:TMemoryStream;
p1,p2:pointer;

....действия...

New(p1,N.setsize); //  выделяем память для копирования из TMemoryStream;
.... копируем в p1

....действия...
инициализация p2

....p2 сохраняем в TMemoryStream;
память по p2 может быть больше чем была в классе,
как корректно то сбросить и записать новые данные ?


 
Сергей М. ©   (2007-12-10 09:24) [1]

N.Size := размер блока памяти, на который указывает p2


 
Palladin ©   (2007-12-10 10:07) [2]

1. максимальное быстродействие

Type
TMS=Class(TMemoryStream)
 Public
  Procedure SP(p:Pointer;s:Integer);
End;

Procedure Tmm.SP;
Begin
SetPointer(p,s);
End;
 
p1:=N.Memory;
TMS(N).SetPointer(p2,sizeP2);


2.

GetMem(p1,N.Size);
Move(N.Memory^,p1^,N.Size);
N.Size:=sizeP2;
Move(p2^,N.Memory^,sizeP2;

3.

N.Seek(0,soFromBeginning);
GetMem(p1,N.Size);
N.Read(p1^,N.Size);
N.Clear;
N.Write(p2^,sizeP2);


 
Palladin ©   (2007-12-10 10:09) [3]

что то переопечатался в 1.

Type
TMS=Class(TMemoryStream)
Public
 Procedure SP(p:Pointer;s:Integer);
End;

Procedure TMS.SP;
Begin
SetPointer(p,s);
End;
 
p1:=N.Memory;
TMS(N).SP(p2,sizeP2);


 
Evgenyy   (2007-12-25 10:27) [4]

Вроде понятно, попробывал без класса,
необязательно быстро - неработает что-то,но ошибок невыдает

var
GlobPo:pointer;
size:word;

{если заблокировано куда писать - пишем временно в память}
if FlashBlock=false then Stream.SaveToFile("temp")
                   else begin
             GetMem(p,Stream.Size);
             GlobPo:=p;
             size:=Stream.Size;
             end;
{...здесь куча кода..}

{грузим из темпа - если заблокирована флешка- значит темп у нас в памяти}
if FlashBlock=false then Stream.LoadFromFile("temp")
                   else begin
Stream.Size:=Size;
Move(Stream.Memory^,p^,Stream.Size);
                        end;

{....здесь куча кода....}

{удаляем файл, если заблокировано - значит очищаем память}
if FlashBlock=false then DeleteFile("temp")
                   else begin
                        Dispose(p);
                        p:=nil;
                        size:=0;
                        end;


 
Сергей М. ©   (2007-12-25 10:39) [5]

Непонятны все эти приседания с "блокированием" и двойной буферизацией  данных (в памяти, указанной в p, и в памяти, распределенной самим  MemoryStream).

Что мешает обойтись одним толькот TMemoryStream ?


 
Evgenyy   (2007-12-25 22:57) [6]

этот код разнесен по всей программе и работает нормально
поток скидывает на диск, пока в другой части не понабятся эти данные
данные на самом деле не одни как показано одним именем "temp"

Завел ключик а если запись на флешке не возможна
или если возможна то хранить в памяти данные
при крахе мусора никакого не будет


 
Сергей М. ©   (2007-12-26 08:30) [7]

Ничего не понял.


> при крахе мусора никакого не будет


При каком "крахе" ? Какого "мусора" ?


 
Evgenyy   (2007-12-26 13:55) [8]

если приложение прибивается или просто вытаскивается флешка на
которой она сама и пишет на той же диск

после  вытаскивания флешки - на флешке файлы temp000001 - temp000999
весом под сотни метров


 
Сергей М. ©   (2007-12-26 14:00) [9]


> если приложение прибивается


А кем и зачем оно "прибивается" ?


> или просто вытаскивается флешка


Это проблемы юзера, а не программера.

Сказано же черным по-русски - сначала остановить устройство, и только потом физически его выковыривать.



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
2-1198744267
ilkz
2007-12-27 11:31
2008.01.27
StringList & Out of memory


2-1198681178
fics
2007-12-26 17:59
2008.01.27
TCanvas (нарисовать стрелочку)


2-1199285953
Stepper
2008-01-02 17:59
2008.01.27
Печать содержимого TRxRichEdit ?


15-1198169940
Pazitron_Brain
2007-12-20 19:59
2008.01.27
Решил пользоваться скайп


1-1192971907
Dimmitt
2007-10-21 17:05
2008.01.27
Синхронная прокрутка двух Memo