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(); } } }