c#自定义循环缓冲区

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32352825/article/details/86537492
今日推荐