using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Timers;
using System.Windows.Forms;
//using System.Threading;
namespace GeneralLib
{
///
/// 模拟数据产生事件的委托
///
///
public delegate void DemoCreatEvt(DemoResult result);
///
/// 模拟结果
///
public class DemoResult
{
public string KeyID = "";
public string Value = "";
public double Speed = 0;
}
///
/// 演示模式接口
///
public interface IDemo
{
///
/// 获取模拟结果
///
///
string GetValue();
}
///
/// 基本模式,如签到,只需事件,值自定义
///
public class BaseDemo : IDemo
{
///
/// 模拟事件返回值指定
///
public string ResultValue = "";
///
/// 获取模拟结果
///
///
public string GetValue()
{
return ResultValue;
}
}
///
/// 选择模式
///
public class ChoiceDemo : IDemo
{
///
/// 选项个数
///
public int OptionCount = 4;
///
/// 可选个数
///
public int LimitCount = 1;
///
/// 是否选满可选个数
///
public bool IsForced = false;
///
/// 选项格式是否ABCD
///
public bool IsABC = false;
///
/// 结果是否排序
///
public bool IsOrderly = false;
///
/// 获取模拟结果
///
///
public string GetValue()
{
string res = "";
Random rnd = new Random();
int sel = LimitCount;
if (!IsForced)
{
sel = (int)(LimitCount * rnd.NextDouble()) + 1;
}
List listOption = new List();
for (int i = 1; i <= OptionCount; i++)
{
listOption.Add(i);
}
List listRes = new List();
for (int i = 1; i <= sel; i++)
{
int n = (int)(listOption.Count * rnd.NextDouble());
int val = listOption[n];
listOption.Remove(val);
listRes.Add(val);
}
if (listRes.Count > 0)
{
if (IsOrderly)
listRes.Sort();
string[] aryRes = new string[listRes.Count];
if (IsABC)
{
for (int i = 0; i < listRes.Count; i++)
aryRes[i] = Convert.ToChar(64 + listRes[i]).ToString();
}
else
{
for (int i = 0; i < listRes.Count; i++)
aryRes[i] = listRes[i].ToString();
}
res = string.Join(",", aryRes);
}
return res;
}
}
///
/// 数值模式
///
public class NumberDemo : IDemo
{
///
/// 最大值
///
public int MaxVal = 100;
///
/// 最小值
///
public int MinVal = -100;
//public int MaxLen = 0;
///
/// 小数位,-1为任意小数位
///
public int Decimal = 0;
///
/// 获取模拟结果
///
///
public string GetValue()
{
string res = "";
Random rnd = new Random();
int v1 = MinVal;
int v2 = MaxVal;
if (MaxVal < MinVal)
{
v1 = MaxVal;
v2 = MinVal;
}
int vRnd = 0;
int dec = 0;
if (Decimal == -1)
dec = (int)(5 * rnd.NextDouble());
else if (Decimal > 0)
dec = Decimal;
if (dec > 0)
{
double pow = Math.Pow(10, dec);
v1 = v1 * (int)pow;
v2 = v2 * (int)pow;
vRnd = (int)((v2 - v1 + 1) * rnd.NextDouble()) + v1;
res = ((double)vRnd / pow).ToString("F" + dec);
}
else
{
vRnd = (int)((v2 - v1 + 1) * rnd.NextDouble()) + v1;
res = vRnd.ToString();
}
return res;
}
}
///
/// 模拟控制类
///
public class Imitation
{
///
/// 键盘列表
///
public List KeyIDList = new List();
/////
///// 预定值列表
/////
//public List ValueList = new List();
/////
///// 结果仅从预定值列表产生
/////
//public bool OnlyValueList = false;
///
/// 模拟数据产生事件
///
public event DemoCreatEvt DemoCreat;
///
/// 演示模式
///
public IDemo DemoType = null;
///
/// 控制计时器,产生数据事件
///
private Timer TmrDemo = new Timer();
///
/// 启动时间,用来计算速度
///
private int timeStart = 0;
public Imitation()
{
TmrDemo.Interval = 1000;
TmrDemo.Enabled = false;
TmrDemo.Tick += new EventHandler(TmrDemo_Tick);
}
~Imitation()
{
TmrDemo.Stop();
TmrDemo.Enabled = false;
}
///
/// 事件计时间隔
///
public int Interval
{
get { return TmrDemo.Interval; }
set { TmrDemo.Interval = value; }
}
///
/// 已经产生的模拟数据,若重新开始模拟,需要清空,否则就是继续
///
public Dictionary ResultList = new Dictionary();
///
/// 未模拟过的键盘
///
List KeyIDListCreate = new List();
///
/// 启动模拟
///
public void Start()
{
//初始化未模拟ID的列表
KeyIDListCreate.Clear();
foreach (var key in KeyIDList)
{
if (!ResultList.ContainsKey(key))
KeyIDListCreate.Add(key);
}
TmrDemo.Start();//开始模拟
timeStart = Environment.TickCount;//记住开始时间
}
///
/// 停止模拟
///
public void Stop()
{
TmrDemo.Stop();
}
///
/// 产生模拟数据
///
void CreateData()
{
try
{
if (!TmrDemo.Enabled) return;
if (DemoCreat != null)
{
DemoResult demoRes = new DemoResult();
if (KeyIDListCreate.Count > 0)
{
Random rnd = new Random();
int nRnd = (int)(KeyIDListCreate.Count * rnd.NextDouble());
demoRes.KeyID = KeyIDListCreate[nRnd];
//KeyIDListCreate.Remove(demoRes.KeyID);//放在最后。杨斌 2014-06-06
}
else
{
Random rnd = new Random();
int nRnd = (int)(KeyIDList.Count * rnd.NextDouble());
demoRes.KeyID = KeyIDList[nRnd];
////杨斌 2014-06-06
//List lstNoVote = new List();
//foreach (int key in KeyIDList)
//{
// if (!ResultList.ContainsKey(key))
// lstNoVote.Add(key);
//}
//if (lstNoVote.Count > 0)
//{
// nRnd = (int)(lstNoVote.Count * rnd.NextDouble());
// demoRes.KeyID = lstNoVote[nRnd];
//}
}
demoRes.Value = DemoType.GetValue();
demoRes.Speed = (Environment.TickCount - timeStart) / (double)1000;
if (ResultList.ContainsKey(demoRes.KeyID))
ResultList[demoRes.KeyID] = demoRes;
else
ResultList.Add(demoRes.KeyID, demoRes);
if (KeyIDListCreate.Contains(demoRes.KeyID))//杨斌 2014-06-06
KeyIDListCreate.Remove(demoRes.KeyID);
DemoCreat(demoRes);
}
}
catch(Exception ex)
{
//SystemLog.WriterLog(ex, false);
}
}
//计时器事件产生模拟事件
void TmrDemo_Tick(object sender, EventArgs e)
{
CreateData();
}
}
}