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

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

Нужно организовать кольцевой буфер из байт. [D7, WinXP]


misyachniy ©   (2006-05-05 14:02:00) 

Данные поступают в буфер неравномерно и выбираются тоже.
Есть желание огранизовать кольцевой буфер из байт.
Но Delphi не позволяет сравнивать указатели, а только добавлять или отнимать целочисленные значения.
Например

if (pEnd > pStart)

Вызывает ошибку:

[Error] Buffers.pas(34): Operator not applicable to this operand type


Есть ли решение?
Или использовать два буфера и не заморачиватся?
Спасибо.


Evgeny V   (2006-05-06 14:07:00) [1]

Прошу прощение за опечатку PeekNamdePipe -> PeekNamedPipe верное название функции


Evgeny V   (2006-05-06 14:03:00) [2]


> Жаль только не можно опрашивать сколько в буфере есть байт.

Если речь о Pipe - то можно, см PeekNamdePipe, работает и с анонимными пайпами


misyachniy   (2006-05-06 13:09:00) [3]

Наверное это наиболее подходящий вариант.
Жаль только не можно опрашивать сколько в буфере есть байт.
Ну это уже организую.
А размер 4096 это по умолчанию.


Slym   (2006-05-06 04:37:00) [4]

Самый простой кольцевой буфер:
CreatePipe - размер буфера 4095, при переполнении переполняющий поток будет преостановлен до освобождения буфера.


Slym   (2006-05-05 16:55:00) [5]

Я так понял ты делаешь аля TBufferedPipe
Я бы делал так
PInternalBuffer=^TInternalBuffer;
TInternalBuffer=record
AllocatedSize:integer;
DataSize:integer;
Memory:pointer;
end;

TBuffer=class
FBuffers:TList;

proc Write(data)
func Read(size):data;
end;

Write(data)
begin

:Вернемся_сюда_если_не_дописали

Buffer:=FBuffers[FBuffers.Count-1];
copy(Buffer.Memory+смещение на DataSize,data,сколько_свободного_места "AllocatedSize-DataSize");
DataSize=DataSize+сколько_записали;

если_не_все записали то создаем новый буфер
остатки сбрасываем в новый буфер
InternalBuffer=New(PInternalBuffer);
InternalBuffer.AllocatedSize=4096;
InternalBuffer.DataSize=0;
GetMem(InternalBuffer.Memory,InternalBuffer.AllocatedSize)
FBuffers.Add(InternalBuffer);

goto Вернемся_сюда_если_не_дописали
end;

чтение в обратном порядке :) и никакой особой фрагментации


Slym   (2006-05-05 16:36:00) [6]

misyachniy ©   (05.05.06 14:02)
поступают в буфер неравномерно и выбираются тоже

не думаешь что поступать будет чаще и кольцо твое на N раз перетрется до выборки?

Оно тебе вообще надо? за фрагментацию памяти боишЪся?


misyachniy   (2006-05-05 16:21:00) [7]

Наверное правильнее к cardinal.
PChar и PWideChar допускают прямые сравнения
<pre>
The relational operators <, >, <=, and >= can take operands of type PChar and PWideChar
</pre>


palva   (2006-05-05 15:48:00) [8]

> к чему приводить указатели на байт, чтобы сравнить собственно указатели?

Можно к PChar, можно к Integer.


Сергей М.   (2006-05-05 15:44:00) [9]


> к чему приводить указатели на байт


Ну хотя бы к Cardinal


misyachniy   (2006-05-05 15:37:00) [10]

Мысль конечно интересная.
Расскажите к чему приводить указатели на байт, чтобы сравнить собственно указатели?


Сергей М.   (2006-05-05 14:05:00) [11]

ты про приведение типов в делфи-паскале что-нть слышал ?


Сергей М.   (2006-05-05 14:04:00) [12]


> Delphi не позволяет сравнивать указатели


Чавой-то ?


Наверх

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