版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32352825/article/details/86537492
c#自定义循环缓冲区
用于存储连续发送的数据,如网口,串口数据包,考虑了数据追尾,溢出
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ODSensor //泛型集合
{
public class MultiBuffer_NET_DISP_T<T>
{
int Buffer2_rowNum;
T[,] Buffer2_buffer = null;
int[] Buffer2_head = new int[10];
int[] Buffer2_tail = new int[10];
int sensors_num = 1;
long[] headPlus = new long[10];
long[] tailPlus = new long[10];
public MultiBuffer_NET_DISP_T()
{
}
public bool MultiBuffer_init(int sensor_num,int rowNum)
{
if (sensor_num > 10 || rowNum > 100000)
{
return false;
}
Buffer2_buffer = new T[sensor_num, rowNum];
Buffer2_rowNum = rowNum;
sensors_num = sensor_num;
for (int i = 0; i < 10; i++)
{
Buffer2_head[i] = 0;
Buffer2_tail[i] = 0;
headPlus[i] = 0;
tailPlus[i] = 0;
}
return true;
}
public bool MultiBuffer_getValue(int index, ref T line)
{
//if (line == 0)
// return false;
//因为是循环缓冲区,所以head可能比tail大、或小
if (Buffer2_tail[index] == Buffer2_head[index])
{
return false;
}
line = Buffer2_buffer[index,Buffer2_tail[index]];
if (++Buffer2_tail[index] >= Buffer2_rowNum)
{
Buffer2_tail[index] = 0;
//没有控制
tailPlus[index]++;
}
return true;
}
public bool MultiBuffer_addValue(int index, T value)
{
Buffer2_buffer[index,Buffer2_head[index]] = value;
if (++Buffer2_head[index] >= Buffer2_rowNum)
{
Buffer2_head[index] = 0;
headPlus[index]++;
}
//发生追尾,说明缓冲区溢出
if ((Buffer2_head[index] == Buffer2_tail[index]) && (tailPlus[index] != headPlus[index]))
{
return false;
}
return true;
}
public bool MultiBuffer_hasValue(int index)
{
//因为是循环缓冲区,所以head可能比tail大、或小
if (Buffer2_tail[index] == Buffer2_head[index])
{
return false;
}
return true;
}
public int MultiBuffer_getValueCount(int index)
{
int count;
if (Buffer2_head[index] >= Buffer2_tail[index])
{
count = Buffer2_head[index] - Buffer2_tail[index];
}
else
{
count = Buffer2_rowNum - Buffer2_tail[index] + Buffer2_head[index];
}
return count;
}
public void MultiBuffer_reset()
{
for (int i = 0; i < 10; i++)
{
Buffer2_head[i] = 0;
Buffer2_tail[i] = 0;
headPlus[i] = 0;
tailPlus[i] = 0;
}
}
}
}