易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

易版环形缓冲区 理论上支持多线程   [复制链接]

    2021-05-24 19:31:43
    高级教程源码
    易语言资源网
    2005 次浏览
    来源链接
这个环形缓冲区是基于 http://circularbuffer.codeplex.com/ http://en.wikipedia.org/wiki/Circular_buffer 修改的
最近自己项目用到的一个缓冲区,理论上支持多线程
在自己的多线程项目测试过,暂时没有问题

下面科普下环形缓冲区在内存里的变化:

环形缓冲区首先从空开始并具有设置的长度;在下图中,是一个7字节的缓冲区:



假设在环形缓冲区的中心写入1(确切的起始位置在环形缓冲区中并不重要):



然后,假设将另外两个字节(2&3)添加到环形缓冲区,它们将放在1之后:  



如果删除了两个字节,则环形缓冲区内部的两个最早加入的值将被删除。 环形缓冲区使用FIFO(先进先出)逻辑。 在示例1和2中,第一个进入“环形缓冲区”则第一个被移除,而将3留在缓冲区中。   



如果缓冲区有7个字节,则它已经完全占满:



环形缓冲区的一个特性是,当缓冲区已满并执行后续写入操作时,它将开始覆盖最早的数据。 在当前示例中,添加了两个元素A和B并覆盖了3和4:



最后,如果现在删除了两个字节,则返回的不是3&4而是5&6,因为A&B覆盖了3&4,产生了带有以下内容的缓冲区:  



环形缓冲区使用说明:

环形缓冲区的特性是,在使用环形缓冲区时,不会导致内部数据乱七八糟。 (如果使用了非环形缓冲区,那么在没取一个字节时,就必须对所有字节进行移位。)换句话说,环形缓冲区非常适合作为FIFO(先进先出)缓冲区,而标准缓冲区则适合用作FIFO(先进先出)缓冲区。非环形缓冲区非常适合用作LIFO(后进先出)缓冲区。

对于具有固定最大大小的队列,使用环形缓冲是一种很好的实现策略。如果队列采用最大大小,则环形缓冲区是完全理想的实现;所有队列操作都是固定时间。但是,扩展循环缓冲区需要转移存储器,这是非常耗时和消耗资源的。对于任意扩展的队列,可以首选使用链表方法。

这个是24个字节的环形缓冲区



当写指针即将到达读指针时(由于微处理器没有响应),缓冲区停止记录击键。 在某些计算机上会发出哔声。

这个排版真累人- .-

2021/5/16  源码更新:

[+] 为了大家方便理解新增了Demo

2021/5/15  源码更新:

[!] 修复致命BUG,受影响函数:CircularBufferGetBytes、CircularBufferGetBytesFoIndex、CircularBufferPutToMem、CircularBufferPutBytes

下面为更新后代码:



点我下载 (已有 50 次下载)

引用模块


源码文件名 模块文件名
Client.e
HPSocket For E 5.8.1 Sync.ec
CircularBuffer.ec
Server.e
HPSocket For E 5.8.1 Sync.ec


引用支持库


源码文件名 支持库文件名 支持库标识
CircularBuffer.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
Client.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
Server.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325


[错误报告]   上一篇:易语言窗口转火山视窗窗口源码...     下一篇:X86驱动注入源码...