zoukankan      html  css  js  c++  java
  • 分享一个秒计数器

    在实际应用中我们经常要对一个或多个操作进行一个简单的秒操作数量计算,由于在.net里找不到这样一个类,所以实现了这样一个功能类并分享出来.这个类的主要功能是可以记录一个或多个的秒讲数处理,并每秒触发一个通知事件提供每一项的讲数情况包括:当前秒数量,最大数和平均值等.

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 
      5 namespace Smark
      6 {
      7     /// <summary>
      8     /// Copyright © henryfan 2012        
      9     /// Email:  henryfan@msn.com    
     10     /// HomePage:   http://www.ikende.com       
     11     /// CreateTime: 2012/10/27 21:56:05
     12     /// </summary>
     13     public class SecondCounter : IDisposable
     14     {
     15         public SecondCounter()
     16         {       
     17             mTimer = new System.Threading.Timer(OnCallBack, this, 10, 990);     
     18         }
     19 
     20         private System.Diagnostics.Stopwatch mStopwatch = new System.Diagnostics.Stopwatch();
     21 
     22         /// <summary>
     23         /// 计数描述接口
     24         /// </summary>
     25         interface ICounter
     26         {
     27             /// <summary>
     28             /// 执行
     29             /// </summary>
     30             void Process();
     31             /// <summary>
     32             /// 重置信息
     33             /// </summary>
     34             void Reset();
     35         }
     36         /// <summary>
     37         /// 计数项
     38         /// </summary>
     39         public class CounterItem : ICounter
     40         {
     41             private long mCount = 0;
     42             private long mLastCount;
     43             private int mTickCount;
     44             public int Max
     45             {
     46                 get;
     47                 private set;
     48 
     49             }
     50             public int Avg
     51             {
     52                 get;
     53                 private set;
     54             }
     55             public int Min
     56             {
     57                 get;
     58                 private set;
     59             }
     60 
     61             public int Value
     62             {
     63                 get;
     64                 private set;
     65             }
     66             public string Name
     67             {
     68                 get;
     69                 set;
     70             }
     71             public void Add()
     72             {
     73                 System.Threading.Interlocked.Increment(ref mCount);
     74             }
     75             public long Count
     76             {
     77                 get
     78                 {
     79                     return mCount;
     80                 }
     81             }
     82             public void Add(long value)
     83             {
     84                 System.Threading.Interlocked.Add(ref mCount, value);
     85             }
     86             void ICounter.Process()
     87             {
     88                 mTickCount++;
     89                 Value = (int)(mCount - mLastCount);
     90                 mLastCount = mCount;
     91                 if (Value < Min)
     92                     Min = Value;
     93                 if (Value > Max)
     94                     Max = Value;
     95                 Avg = (int)(Count / mTickCount);
     96             }
     97             public override string ToString()
     98             {
     99                 return string.Format("{0}:\t{1}/s[Count:{2},Max:{3},Avg:{4}]", Name, Value, mCount, Max, Avg);
    100 
    101 
    102             }
    103 
    104 
    105             void ICounter.Reset()
    106             {
    107                 mTickCount = 0;
    108                 mCount = 0;
    109                 Value = 0;
    110                 mLastCount = 0;
    111                 Max = 0;
    112                 Min = 99999;
    113             }
    114         }
    115         /// <summary>
    116         /// 回调事件
    117         /// </summary>
    118         public event Action<IList<CounterItem>> Tick;
    119         private List<CounterItem> mItems = new List<CounterItem>();  
    120         /// <summary>
    121         /// 添加计数项
    122         /// </summary>
    123         /// <param name="name">计数项名称</param>
    124         /// <returns>CounterItem</returns>
    125         public CounterItem Add(string name)
    126         {
    127             CounterItem item = new CounterItem();
    128             item.Name = name;
    129             mItems.Add(item);
    130             return item;
    131         }
    132 
    133         private bool mIsPause = true;
    134 
    135         /// <summary>
    136         /// 开始计数
    137         /// </summary>
    138         public void Start()
    139         {
    140             
    141             mIsPause = false;
    142             for (int i = 0; i < mItems.Count; i++)
    143             {
    144                 ((ICounter)mItems[i]).Reset();
    145             }
    146             mStopwatch.Reset();
    147             mStopwatch.Start();
    148 
    149         }
    150 
    151         public double UseTimes
    152         {
    153             get
    154             {
    155                 return mStopwatch.Elapsed.TotalMilliseconds;
    156             }
    157         }
    158 
    159         /// <summary>
    160         /// 暂停计数
    161         /// </summary>
    162         public void Pause()
    163         {
    164             mIsPause = true;
    165             mStopwatch.Stop();
    166         }
    167 
    168         private void OnCallBack(object state)
    169         {
    170             if (!mIsPause)
    171             {
    172                 for (int i = 0; i < mItems.Count; i++)
    173                 {
    174                     ((ICounter)mItems[i]).Process();
    175                 }
    176                 try
    177                 {
    178                     if (Tick != null)
    179                     {
    180                         Tick(mItems);
    181                     }
    182                 }
    183                 catch
    184                 {
    185                 }
    186             }
    187         }
    188 
    189         private System.Threading.Timer mTimer;
    190 
    191         private bool mIsDisposed = false;
    192 
    193         public void Dispose()
    194         {
    195             lock (this)
    196             {
    197                 if (!mIsDisposed)
    198                 {
    199                     if (mTimer != null)
    200                         mTimer.Dispose();
    201                     mIsDisposed = true;
    202                 }
    203             }
    204         }
    205     }
    206 }

    使用

    计数器的使用也很简单,定义具体的项;在指定的地方添加计数即可:

     1         static SecondCounter mSCounter;
     2         static SecondCounter.CounterItem ci1;
     3         static SecondCounter.CounterItem ci2;
     4         static SecondCounter.CounterItem ci3;
     5         static Random mRan = new Random();
     6         static void Main(string[] args)
     7         {
     8             mSCounter = new SecondCounter();
     9             ci1 = mSCounter.Add("TEST1");
    10             ci2 = mSCounter.Add("TEST2");
    11             ci3 = mSCounter.Add("TEST3");
    12             mSCounter.Tick += (s) => {
    13                 foreach (SecondCounter.CounterItem item in s)
    14                 {
    15                     Console.WriteLine(item);
    16                 }
    17             };
    18            
    19             System.Threading.ThreadPool.QueueUserWorkItem(Test1);
    20             System.Threading.ThreadPool.QueueUserWorkItem(Test2);
    21             System.Threading.ThreadPool.QueueUserWorkItem(Test3);
    22             mSCounter.Start();
    23             Console.Read();
    24 
    25         }
    26 
    27         static void Test1(object state)
    28         {
    29             while (true)
    30             {
    31                 ci1.Add();
    32                 System.Threading.Thread.Sleep(mRan.Next() % 100);
    33             }
    34         }
    35         static void Test2(object state)
    36         {
    37             while (true)
    38             {
    39                 ci2.Add();
    40                 System.Threading.Thread.Sleep(mRan.Next() % 100);
    41             }
    42         }
    43         static void Test3(object state)
    44         {
    45             while (true)
    46             {
    47                 ci3.Add();
    48                 System.Threading.Thread.Sleep(mRan.Next() % 100);             
    49             }
    50         }
    51        

    使用情况图

    访问Beetlex的Github
  • 相关阅读:
    排序算法的体验游戏
    【转】[Java] HashMap使用的示例
    【转】【Android】使用BaseAdapter实现复杂的ListView
    【转】Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
    【转】Java集合框架List,Map,Set等全面介绍
    【转】java参数传递(超经典)
    bluetooth记录
    【转】Java 字符串常用操作(String类)
    【转】Java中字符串中子串的查找共有四种方法(indexof())
    【转】BLE 学习记录
  • 原文地址:https://www.cnblogs.com/smark/p/2827239.html
Copyright © 2011-2022 走看看