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

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

TMemoryStream - копировать, сохранить [D7, XP]


Evgenyy ©   (2007-12-10 09:09:00) 

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

var
N:TMemoryStream;
p1,p2:pointer;

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

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

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

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


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


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


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


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


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

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


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

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

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


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

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


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


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


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

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

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


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

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

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


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

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

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;


Palladin   (2007-12-10 10:09:00) [7]

что то переопечатался в 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);


Palladin   (2007-12-10 10:07:00) [8]

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);


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

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


Наверх

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