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

Вниз

Нужно организовать кольцевой буфер из байт.   Найти похожие ветки 

 
misyachniy ©   (2006-05-05 14:02) [0]

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

if (pEnd > pStart)

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

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


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


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


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


Чавой-то ?


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

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


 
misyachniy ©   (2006-05-05 15:37) [3]

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


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


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


Ну хотя бы к Cardinal


 
palva ©   (2006-05-05 15:48) [5]

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

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


 
misyachniy ©   (2006-05-05 16:21) [6]

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


 
Slym ©   (2006-05-05 16:36) [7]

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

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

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


 
Slym ©   (2006-05-05 16:55) [8]

Я так понял ты делаешь аля 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-06 04:37) [9]

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


 
misyachniy ©   (2006-05-06 13:09) [10]

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


 
Evgeny V ©   (2006-05-06 14:03) [11]


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

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


 
Evgeny V ©   (2006-05-06 14:07) [12]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.045 c
15-1153832388
Ломброзо
2006-07-25 16:59
2006.08.27
Командный интерпретатор


9-1128392796
Старик
2005-10-04 06:26
2006.08.27
Скелетная анимация


2-1154693181
AlexanderMS
2006-08-04 16:06
2006.08.27
Работа с иконками (TIcon).


2-1154932975
NordRus
2006-08-07 10:42
2006.08.27
Загадки Clipboard


3-1150649448
Merry
2006-06-18 20:50
2006.08.27
Сохранение Query