/// <summary>
/// Copyright © henryfan 2012
/// Email: henryfan@msn.com
/// HomePage: http://www.ikende.com
/// CreateTime: 2012/10/27 21:56:05
/// </summary>
public class SecondCounter:IDisposable
{
interface ICounter
{
void Process();
}
public event Action<CounterItem> Tick;
private List<CounterItem> mItems = new List<CounterItem>();
public class CounterItem : ICounter
{
private long mCount=0;
private long mLastCount;
public int Value
{
get;
private set;
}
public string Name
{
get;
set;
}
public void Add()
{
System.Threading.Interlocked.Increment(ref mCount);
}
public long Count
{
get
{
return mCount;
}
}
public void Add(long value)
{
System.Threading.Interlocked.Add(ref mCount, value);
}
void ICounter.Process()
{
Value = (int)(mCount - mLastCount);
mLastCount = mCount;
}
public override string ToString()
{
return string.Format("{0}:\t{1}/s", Name, Value);
}
}
public CounterItem Add(string name)
{
CounterItem item = new CounterItem();
item.Name = name;
mItems.Add(item);
return item;
}
public void Open()
{
mTimer = new System.Threading.Timer(OnCallBack, this, 10, 980);
}
private void OnCallBack(object state)
{
for (int i = 0; i < mItems.Count; i++)
{
((ICounter)mItems[i]).Process();
}
try
{
if (Tick != null)
{
for (int i = 0; i < mItems.Count; i++)
{
Tick(mItems[i]);
}
}
}
catch
{
}
}
private System.Threading.Timer mTimer;
private bool mIsDisposed = false;
public void Dispose()
{
lock (this)
{
if (!mIsDisposed)
{
if (mTimer != null)
mTimer.Dispose();
}
}
}
}