C# 使用SnsSharp的多线程框架处理耗时的功能代码

gitee下载地址:https://gitee.com/linsns/snssharp

使用举例:

例子:数据量大概15.6GB/s,单帧数据大小5120*4096*4=80MB,数据产生的速度是每秒200次,需将产生的数据及时进行复制。

1、首先我们使用SnsMultiThread 创建多线程处理的类及其响应函数。

byte[] src = new byte[5120 * 4096 * 4];
byte[] dst = new byte[5120 * 4096 * 4];    

SnsMultiThread snsMultiTh = new SnsMultiThread();
int maxThCount = snsMultiTh.GetMaxThCount();
snsMultiTh.ThCount = maxThCount;
snsMultiTh.MultiThEventHandler += MultiTh_MultiThEventHandler;
snsMultiTh.Start();

private void MultiTh_MultiThEventHandler(long id, int thId, object objSend)
{
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
}

其中函数MultiTh_MultiThEventHandler为多线程自动处理的响应函数,放在这里的代码将会有不同的线程来执行处理,也就是会自动分配给非忙碌状态下的线程来执行。

2、接下来我们模拟数据产生的功能,我们使用SnsLoopThread 来创建循环线程,每秒钟循环200次,由于电脑无法模拟这么高速的产生随机数,因此只产生前2000个数的随机数,。

SnsLoopThread thGrabData = new SnsLoopThread(LoopGrabData);
thGrabData.IsBackground = true;
thGrabData.Start();

private void LoopGrabData()
{
    #region 这个也可以不要,仅仅是为了有动态的效果
    for (int i = 0; i < 2000; i++)
    {
        src[i] = (byte)random.Next(0, 255);
    }
    #endregion
    snsMultiTh.Submit(frameId);//提交信号,让多线程去处理
    frameId++;
    Thread.Sleep(5);//1秒钟执行200次循环,模拟200帧率
}

3、结果显示,使用定时器,每秒钟查询10次数据,查询线程使用的数量,当前线程的id,当前帧数,所搬运的数据(前2000)等。

timer1.Interval = 100;
timer1.Tick += Timer1_Tick;
timer1.Start();

private void Timer1_Tick(object sender, EventArgs e)
{
    int usedThCount = 0;
    int totalThCount = 0;
    snsMultiTh.GetUsedThState(ref usedThCount, ref totalThCount);
    float mb= (long)src.Length / 1024.0f / 1024.0f;
    float gb = (long)src.Length * 200 / 1024.0f / 1024.0f / 1024.0f;
    label1.Text = string.Format("状态:数据量:{0:F1}GB/s  Thread数量:{1}/{2}  当前线程id:{3}  单帧大小:{4:F1}MB  当前帧数:{5}", gb, usedThCount, totalThCount, this.thId, mb, this.count);
    label1.ForeColor = usedThCount >= totalThCount ? Color.Red : Color.Black;
    string str = BitConverter.ToString(dst, 0, 2000).Replace("-", " ");
    txtShow.Text = str;
}

效果:

技术交流

QQ群: 577276243

你可能感兴趣的:(SnsSharp,c#)