📄 u_share_ringbuffer.pas
字号:
function TRingBuffer.WriteBuffer(const Buffer; Count: Integer): Longint;
var
Li_RemainCount,Litemp : Integer;
tempbuf:array[0..MAX_BUFFER_LEN] of Char;
EmptyCount:Integer;
begin
try
Require();
EmptyCount := GetEmptyCount(); //获取可写入的数据大小
if (Count < 0) or (Count > FBufferLen) then
begin
Result := -1;
Exit;
end;
if (EmptyCount <=0) then //无数据可写
begin
Result := 0;
Exit;
end;
//如果写入的缓冲区超过尾部,就跳回头部写入
if EmptyCount >= Count then
begin
if FWritePos < FReadPos then
begin
Move(Buffer,FBuffer[FWritePos],Count);
Inc(FWritePos,Count);
Result := Count;
FisWrap := True;
end else begin
//判断是否到末尾,还有足够缓冲
Li_RemainCount := FBufferLen - FWritePos;
if (Li_RemainCount >= Count ) then
begin
Move(Buffer,FBuffer[FWritePos],Count);
Inc(FWritePos,Count);
Result := Count;
FisWrap := False;
end else begin //末尾缓冲不够,返回头部读取
Litemp :=Count - Li_RemainCount ; //尾部无法写入返回头部写入的数据
FillChar(tempbuf,MAX_BUFFER_LEN-1,0);
Move(Buffer,tempbuf,Count); //暂存数据到临时buf
Move(tempbuf,FBuffer[FWritePos],Li_RemainCount);
FWritePos := Litemp;
Move(tempbuf[Li_RemainCount],FBuffer[0],Litemp); //返回头部写入剩余的数据
Result := Count;
FisWrap := false;
end;
end;
end
else
begin //缓冲区不足以写入全部数据,可以写入部分数据
if FWritePos < FReadPos then
begin
Result := FReadPos - FWritePos;
Move(Buffer,FBuffer[FWritePos],Result);
Inc(FWritePos,Result);
FisWrap := True;
end
else
begin
//判断是否到末尾,还有足够缓冲
Li_RemainCount := FBufferLen - FWritePos;
FillChar(tempbuf,MAX_BUFFER_LEN-1,0);
Move(Buffer,tempbuf,Count); //暂存数据到临时buf
Move(tempbuf,FBuffer[FWritePos],Li_RemainCount);
if FReadPos > 0 then
begin
FWritePos := FReadPos;
Move(tempbuf[Li_RemainCount],FBuffer[0],FReadPos); //返回头部写入剩余的数据
Result := Li_RemainCount + FReadPos;
FisWrap := true;
end else begin
Inc(FWritePos,Li_RemainCount);
Result := Li_RemainCount;
FisWrap := False;
end;
end;
end;
finally
Release();
end;
end;
{——————————————————————————-
过程名: TRingBuffer.GetDataCount
作者: 黄健
日期: 2007.08.25
参数: 无
返回值: Longint 返回当前可读的数据量
——————————————————————————-}
function TRingBuffer.GetDataCount: Longint;
begin
try
Require();
if (FWritePos = 0) and (FReadPos = FWritePos) then
begin
Result := 0;
Exit;
end;
if (FWritePos > FReadPos ) then
begin
Result := FWritePos - FReadPos;
end
else if FWritePos < FReadPos then begin
Result := FBufferLen - FReadPos + FWritePos;
end
else
if FWritePos = FReadPos then begin
if FisWrap then Result := FBufferLen else Result := 0;
end;
finally
Release();
end;
end;
{——————————————————————————-
过程名: TRingBuffer.GetEmptyCount
作者: 黄健
日期: 2007.08.25
参数: 无
返回值: Longint 返回当前可写的数据量
——————————————————————————-}
function TRingBuffer.GetEmptyCount: Longint;
begin
try
Require();
if FWritePos > FReadPos then
Result := FBufferLen - FWritePos + FReadPos
else if FWritePos < FReadPos then
Result := FReadPos - FWritePos
else if FWritePos = FReadPos then
begin
if FisWrap then Result := 0 else Result := FBufferLen;
end;
finally
Release();
end;
end;
{——————————————————————————-
过程名: TRingBuffer.ResizeBuffer
作者: 黄健
日期: 2007.08.25
参数: ABufferLen: Longint
返回值: Boolean 改变缓冲区大小,返回false表示失败,true表示成功
——————————————————————————-}
function TRingBuffer.ResizeBuffer(ABufferLen: Longint): Boolean;
begin
Result := False;
try
Require();
if ABufferLen < FBufferLen then Exit;
SetLength(FBuffer,ABufferLen);
FBufferLen := ABufferLen;
finally
Release();
end;
end;
{ TRingBufferSyn }
constructor TRingBufferSyn.Create(ABufferLen: Integer);
begin
inherited Create(ABufferLen);
FIsCritical := True;
FSynEvent := CreateEvent(nil,true, false,pchar('RingBuffer'));
end;
destructor TRingBufferSyn.Destory;
begin
CloseHandle(FSynEvent);
inherited Destory();
end;
{——————————————————————————-
过程名: TRingBufferSyn.ReadbufferSyn
作者: 黄健
日期: 2007.08.26
参数: var Buffer; Count, TimeOut: Integer
返回值: Integer ,返回-1表示错误,-2表示超时 ,>0表示实际读取的字节
——————————————————————————-}
function TRingBufferSyn.ReadbufferSyn(var Buffer; Count, TimeOut: Integer):Integer;
var
ReadCount,RemainCount,ReadPos:Integer;
Abuf:array[0..MAX_BUFFER_LEN-1] of Char;
ATimeOut:Integer;
begin
Result := -1;
FillChar(Abuf,MAX_BUFFER_LEN-1,0);
ReadCount := Readbuffer(Abuf,Count);
if ReadCount < 0 then Exit;
if ReadCount = Count then
begin
Move(Abuf,Buffer,Count);
Result := Count;
end else if ReadCount < Count then
begin
RemainCount := Count - ReadCount;
ReadPos := ReadCount;
ATimeOut := 0;
while (RemainCount <= 0) do
begin
ReadCount := Readbuffer(Abuf[ReadPos],RemainCount);
Inc(ReadPos,ReadCount);
RemainCount := Count - ReadPos;
//Sleep(1);
Inc(ATimeOut);
if ATimeOut >= TimeOut then
begin
Result := -2;
Exit;
end;
end;
Result := Count;
end;
end;
{——————————————————————————-
过程名: TRingBufferSyn.WriteBufferSyn
作者: 黄健
日期: 2007.08.26
参数: const Buffer; Count, TimeOut: Integer
返回值: Integer Integer ,返回-1表示错误,-2表示超时 ,>0表示实际读取的字节
——————————————————————————-}
function TRingBufferSyn.WriteBufferSyn(const Buffer; Count, TimeOut: Integer):Integer;
var
WriteCount,RemainCount,WritePos:Integer;
Abuf:array[0..MAX_BUFFER_LEN-1] of Char;
ATimeOut:Integer;
begin
Result := -1;
FillChar(Abuf,MAX_BUFFER_LEN-1,0);
WriteCount := WriteBuffer(Buffer,Count);
if WriteCount < 0 then Exit;
if WriteCount = Count then
begin
Result := Count;
end else if WriteCount < Count then
begin
Move(Buffer,Abuf,Count);
RemainCount := Count - WriteCount;
WritePos := WriteCount;
ATimeOut := 0;
while (RemainCount <= 0) do
begin
WriteCount := WriteBuffer(Abuf[WritePos],RemainCount);
Inc(WritePos,WriteCount);
RemainCount := Count - WritePos;
//Sleep(1);
Inc(ATimeOut);
if ATimeOut >= TimeOut then
begin
Result := -2;
Exit;
end;
end;
Result := Count;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -