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

Вниз

Как сделать трубопровод?   Найти похожие ветки 

 
Basilio ©   (2003-06-26 18:40) [0]

Как наиболее оптимально реализовать поток (TStream), в котором прочитанные данные тут же исчезали (забывались, стерались)?

Можно использовать TMemoryStream, но там данные, лежащие в начале и уже прочитанные, остаются. было бы замечательно, если бы они автоматически после чтения удалялись (при этом уменьшался размер потока). Есть ли более красивое решение, нежели переписывание метода TMemoryStream.Read, например так:

function TCustomMemoryStream.Read(var Buffer; Count: Longint): Longint;
var SaveBuf:pointer;
NewSize:integer;
begin
if (FPosition >= 0) and (Count >= 0) then
begin
Result := FSize - FPosition;
if Result > 0 then
begin
if Result > Count then Result := Count;
Move(Pointer(Longint(FMemory) + FPosition)^, Buffer, Result);
Inc(FPosition, Result);
//
NewSize:=FSize-FPosition;
GetMem(SaveBuf,NewSize);
Move(Pointer(Longint(FMemory) + FPosition)^, SaveBuf^, NewSize);
Realloc(FMemory,NewSize);
Move(SaveBuf^,FMemory^,NewSize);
FPosition:=0;
//
Exit;
end;
end;
Result := 0;
end;

Здесь код между // запоминает содержимое "конца" потока, делает ReAlloc. Таким образом, каждый вызов Read "изымает" данные из потока.

Насколько оптимально такое решение? Чем может быть чреват частый вызов Realloc? Если поток большой, насколько медленне будет выполняться перераспределение памяти?


 
Basilio ©   (2003-06-26 18:41) [1]

Забыл FSize подправить


 
MBo ©   (2003-06-26 19:09) [2]

посмотри TQueue
может, и пайпы подойдут - Create(Named)Pipe etc


 
Basilio ©   (2003-06-26 19:17) [3]

К очереди надо приделывать read/write(buf,size).
Pipe - то, что нужно. большое спасибо


 
Serginio   (2003-06-26 21:02) [4]

Намного проще возвращать память если MemoryStream реализован ввиде массива страниц памяти. Кстати Борландовский TMemoryStream начинает сдыхать уже после 6МБ. Но динамические массивы вполне устойчивы т.к. иапользуют менеджер памяти а MemoryStream локальную GlobalReAlloc. В любом случае непрерывная память неэффективна при больших объемах. А скорость MemoryStream в виде массива страниц памяти достаточно высокая.



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

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

Наверх




Память: 0.47 MB
Время: 0.023 c
14-44866
Sedunov Vitaly
2003-06-27 10:17
2003.07.14
EhLib, RxLib for Delphi 7


1-44710
off
2003-06-26 08:51
2003.07.14
Использую свой шрифт.


7-44937
Ал
2003-04-30 15:18
2003.07.14
Как получить список часовых поясов, отсортированный как в 2000,XP


6-44777
Renegate
2003-05-07 15:42
2003.07.14
Управление приложенияи по сети.


4-44940
Юлия
2003-05-12 10:55
2003.07.14
Как поменять заголовок окна чужого приложения?