Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизНужно организовать кольцевой буфер из байт. Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c