环形缓冲区的用途及原理可以去百度资料狠多的,这里就不介绍了。直接贴代码.代码分别用D7,XE2编译测试

源码下载 http://files.cnblogs.com/lwm8246/uCircleBuffer.rar

 //环形缓冲区实现类
//-- :
//QQ
unit uCircleBuffer; interface uses
Windows,Classes; type
TCircleBuffer=class
private
FMS:TMemoryStream;
FUserData:Pointer;
function GetMemory: Pointer;
protected
FReadPosition:Integer;
FWritePosition:Integer;
FCanReadCount:Integer;
FCanWrieCount:Integer;
public
constructor Create(const BuffSize:Integer);virtual;
destructor Destroy();override;
function Write(const Buffer;Count:Integer):integer;virtual;
function Read(var Buffer;Count:Integer):Integer;virtual;
public
property ReadPosition:Integer read FReadPosition;
property WritePosition:Integer read FWritePosition;
property CanReadCount:Integer read FCanReadCount;
property CanWrieCount:Integer read FCanWrieCount;
property Memory:Pointer read GetMemory;
property UserData:Pointer read FUserData write FUserData;
end; //线程安全版本
TCircleBufferThread=class(TCircleBuffer)
private
FCS:TRTLCriticalSection;
function GetReadPosition():Integer;
function GetWritePosition():Integer;
function GetCanReadCount():Integer;
function GetCanWrieCount():Integer;
public
constructor Create(const BuffSize:Integer);override;
destructor Destroy();override;
function Write(const Buffer;Count:Integer):integer;override;
function Read(var Buffer;Count:Integer):Integer;override;
public
property ReadPosition:Integer read GetReadPosition;
property WritePosition:Integer read GetWritePosition;
property CanReadCount:Integer read GetCanReadCount;
property CanWrieCount:Integer read GetCanWrieCount;
end; implementation { TCircleBuffer } constructor TCircleBuffer.Create(const BuffSize: Integer);
begin
FMS := TMemoryStream.Create();
FMS.Size := BuffSize;
FMS.Position := ;
FWritePosition := ;
FReadPosition := ;
FCanWrieCount := BuffSize;
FCanReadCount := ;
//\\
ZeroMemory(FMS.Memory,FMS.Size);
end; destructor TCircleBuffer.Destroy;
begin
inherited;
FMS.Free();
end; function TCircleBuffer.GetMemory: Pointer;
begin
Result := FMS.Memory;
end; function TCircleBuffer.Read(var Buffer; Count: Integer): Integer;
var
P:PAnsiChar;
Len,DataLen:Integer;
begin
Result := ;
//(I)
if FCanReadCount <= then
begin
Exit;
end; if Count > FCanReadCount then
DataLen := FCanReadCount
else DataLen := Count; FMS.Position := FReadPosition mod FMS.Size;
Result := FMS.Read(Buffer,DataLen);
Dec(FCanReadCount,Result);
Dec(Count,Result); //(II)
if (Count > ) and (FCanReadCount > ) then //继续读
begin
DataLen := Count;
if DataLen > FCanReadCount then DataLen := FCanReadCount;
FMS.Position := ;
P := @Buffer;
Inc(P,Result);
Len := FMS.Read(P^,DataLen);
Inc(Result,Len);
Dec(FCanReadCount,Len);
end; //增加可写字节数
Inc(FCanWrieCount,Result);
if FCanWrieCount > FMS.Size then FCanWrieCount := FMS.Size; //调整读指针位置
Inc(FReadPosition,Result);
if FReadPosition > FMS.Size then Dec(FReadPosition,FMS.Size); end; function TCircleBuffer.Write(const Buffer; Count: Integer): integer;
var
Len,DataLen:Integer;
P:PAnsiChar;
begin
Result := ;
//(I)
if FCanWrieCount <= then
begin
Exit;
end; if Count > FCanWrieCount then DataLen := FCanWrieCount else DataLen := Count;
FMS.Position := FWritePosition mod FMS.Size;
P := @Buffer;
Result := FMS.Write(Buffer,DataLen);
P := FMS.Memory;
if P = nil then
Exit;
Dec(Count,Result);
Dec(FCanWrieCount,Result);
if (Count > ) and (FCanWrieCount > ) then
begin
//(II)
P := @Buffer;
Inc(P,Result);
Len := FReadPosition - ;
if Count > Len then DataLen := Len else DataLen := Count;
FMS.Position := ;
Len := FMS.Write(P^,DataLen);
Inc(Result,Len);
Dec(FCanWrieCount,Len);
end; //增加可读字节数
Inc(FCanReadCount,Result);
if FCanReadCount > FMS.Size then FCanReadCount := FMS.Size; //调整写指针位置
Inc(FWritePosition,Result);
if FWritePosition > FMS.Size then
FWritePosition := FWritePosition - FMS.Size;
end; { TCircleBufferThread } constructor TCircleBufferThread.Create(const BuffSize: Integer);
begin
InitializeCriticalSection(FCS); //初始化
inherited Create(BuffSize);
end; destructor TCircleBufferThread.Destroy;
begin
DeleteCriticalSection(FCS);
inherited;
end; function TCircleBufferThread.GetCanReadCount: Integer;
begin
EnterCriticalSection(FCS);
Result := FCanReadCount;
LeaveCriticalSection(FCS);
end; function TCircleBufferThread.GetCanWrieCount: Integer;
begin
EnterCriticalSection(FCS);
Result := FCanWrieCount;
LeaveCriticalSection(FCS);
end; function TCircleBufferThread.GetReadPosition: Integer;
begin
EnterCriticalSection(FCS);
Result := FReadPosition;
LeaveCriticalSection(FCS);
end; function TCircleBufferThread.GetWritePosition: Integer;
begin
EnterCriticalSection(FCS);
Result := FWritePosition;
LeaveCriticalSection(FCS);
end; function TCircleBufferThread.Read(var Buffer; Count: Integer): Integer;
begin
EnterCriticalSection(FCS);
try
Result := inherited read(Buffer,Count);
finally
LeaveCriticalSection(FCS);
end;
end; function TCircleBufferThread.Write(const Buffer; Count: Integer): integer;
begin
EnterCriticalSection(FCS);
try
Result := inherited Write(Buffer,Count);
finally
LeaveCriticalSection(FCS);
end;
end; end.

测试代码段:

 procedure TForm1.btn1Click(Sender: TObject);
var
obj:TCircleBuffer;
TmpStr:AnsiString;
Len:Integer;
Buf:array[..] of AnsiChar;
ASize,APosition:Integer;
P:PAnsiChar;
begin obj := TCircleBuffer.Create();
ZeroMemory(@Buf,SizeOf(Buf)); TmpStr := '';
Len := obj.Write(TmpStr[],Length(TmpStr));
P := Obj.Memory;
if P = nil then
Exit; TmpStr := 'ABCD';
Len := obj.Write(TmpStr[],Length(TmpStr));
if Len < then
Exit;
P := Obj.Memory;
if P = nil then
Exit; TmpStr := '';
Len := obj.Read(Buf,);
if Len < then
Exit; P := Obj.Memory;
if P = nil then
Exit; Len := obj.Read(Buf,);
if Len < then
Exit; P := Obj.Memory;
if P = nil then
Exit; tmpStr := 'ABC';
Len := Obj.Write(TmpStr[],);
if Len < then
Exit; tmpStr := '123456#';
Len := Obj.Write(TmpStr[],Length(TmpStr));
if Len < then
Exit; P := Obj.Memory;
if P = nil then
Exit; FillChar(Buf,SizeOf(Buf),$);
// ZeroMemory(@Buf,SizeOf(Buf));
Len := obj.Read(Buf,);
if Len < then
Exit; ZeroMemory(@Buf,SizeOf(Buf));
Len := obj.Read(Buf,);
if Len < then
Exit; P := Obj.Memory;
if P = nil then
Exit; TmpStr := 'AB';
Len := obj.Write(TmpStr[],);
if Len < then
Exit; P := Obj.Memory;
if P = nil then
Exit; TmpStr := 'abcdefghijklmnopqrst';
Len := obj.Write(TmpStr[],Length(TmpStr));
if Len < then
Exit; ZeroMemory(@Buf,SizeOf(Buf));
Len := obj.Read(Buf,);
if Len < then
Exit; if obj <> nil then
obj.Free(); P := Obj.Memory;
if P = nil then
Exit; end;

环形缓冲区实现类(Delphi)的更多相关文章

  1. 物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区

    物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区 随着5G的普及,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Applicatio ...

  2. linux device driver —— 环形缓冲区的实现

    还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...

  3. 35.Linux-分析并制作环形缓冲区

    在上章34.Linux-printk分析.使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[] 1 ...

  4. input子系统事件处理层(evdev)的环形缓冲区【转】

    在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循环队列(circular queue), ...

  5. 环形缓冲区-模仿linux kfifo【转】

    转自:https://blog.csdn.net/vertor11/article/details/53741681 struct kfifo{ uint8_t *buffer; uint32_t i ...

  6. linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现【转】

    转自:https://blog.csdn.net/yusiguyuan/article/details/18368095 1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协 ...

  7. linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言:     在嵌入式开发中,只要是带操作系统的 ...

  8. STM32进阶之串口环形缓冲区实现(转载)

    转载自微信公众号“玩转单片机”,感谢原作者“杰杰”. 队列的概念 在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO) ...

  9. 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

随机推荐

  1. Chrome拷贝插件的对比 zeroclipboard和clipboard插件

    1.zeroclipboard插件 实现原理:Zero Clipboard 利用 Flash 进行复制,用了一个透明的 Flash ,让其漂浮在按钮之上,这样其实点击的不是按钮而是 Flash ,也就 ...

  2. elasticsearch复杂查询-----2

    1.多条件查询 1)查询索引weibo下字段date大于或等于2015-09-05和name为Mary Jone的数据 2.简单查询 1)查询包含2014字符的数据 2)查询包含字符2014-09-1 ...

  3. jQuery中表单的常用操作(全选、反选)

    表单的全选.反选操作一 <form method="post" action=""> 你爱好的运动是?<input type="ch ...

  4. Python开发环境Wing IDE的Blender的Python代码调试技巧

    Wing IDE是一个集成开发环境,可用于开发.测试和调试为Blender编写的Python代码,Blender是一个开源的3 D内容创建系统.Wing IDE提供自动完成.调用提示.强大的调试器.以 ...

  5. lucene中Field简介

    Lucene 6.1.0中存在的field种类如下(后缀是Field): 下面介绍几个常用的Field类型: TextField A field that is indexed and tokeniz ...

  6. 计算结构体、数组、指针的sizeof

    1. 结构体的sizeof 题目: sturct aa{ in num; char name[10];}; struct bb{ int a; float b; struct aa c;}; stru ...

  7. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

  8. JavaScript 正则表单验证(用户名、密码、确认密码、手机号、座机号、身份证号)

    1.关于JavaScript表单验证,如果使用双向绑定的前端js框架,会更容易的多.但是博主还是建议大家不要脱离源生js本身.因为源生js才是王道. 注意: a.代码中的错误提示可能会没有,在代码中找 ...

  9. 数据结构(C#):图的最短路径问题、(Dijkstra算法)

    今天曾洋老师教了有关于图的最短路径问题,现在对例子进行一个自己的理解和整理: 题目: 要求:变成计算出给出结点V1到结点V8的最短路径 答: 首先呢,我会先通过图先把从V1到V8的各种路径全部计算下来 ...

  10. IOS 自定义代理delegate方法

    创建一个自定义代理 @class MJTgFooterView; /** 1.协议名称: 控件类名 + Delegate 2.代理方法普遍都是@optional 3. */ @protocol MJT ...