⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_share_ringbuffer.pas

📁 楠楠写的DBiocp例子都是源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -