王朝网络
分享
 
 
 

你程序会做饭嘛?我能!

王朝学院·作者佚名  2016-05-20  
宽屏版  字体: |||超大  

你程序会做饭嘛?我能!别嘲笑这个标题。我想了很久。有点“投机取巧”的功效吧!

程序当然不能做饭。

之前的我们的系列文章,介绍, 多线程执行,任务派发。定时器执行。脚本加载。程序状态机。

这些都是零零散散,或者说都是模块化介绍,以及模块测试用例。

那么今天我们就来模拟正常程序流程。使用上述的功能性代码完成流程。

当然今天的测试用例程序肯定和做饭有关。今天要做的是模拟一个餐厅的流程。

完成 客人入座 -> 点菜 -> 等待就餐 -> 就餐 -> 等待结账 -> 结账 -> 离开.

期间包括 等待就餐 添加茶水,就餐的添加茶水,添加米饭等随机事件

新建控制台项目:

Sz.Network.DiningRoom 用于存放主文件项目

类库

Sz.Network.DiningRoom.Scripts 用于存放脚本文件项目

我们先来初始化餐厅。

/** * * @author 失足程序员 * @Blog http://www.cnblogs.com/ty408/ * @mail 492794628@QQ.com * @phone 13882122019 * */namespace Sz.Network.DiningRoom{ /// <summary> /// /// </summary> public class 餐厅 { PRivate static 餐厅 instance = new 餐厅(); public static 餐厅 GetInstance { get { return instance; } } public long 全局线程 = 0; public long 厨师s = 0; public long 传菜员s = 0; public long 服务员s = 0; public long 配菜员s = 0; public long 收银员s = 0; public long 洗菜员s = 0; public 客人[] table = null; public void Init(int tableSize) { Logger.Info("初始化餐厅"); //所有的工作人员都是一个线程 全局线程 = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("全局线程", 1)); //所有的工作人员都是一个线程 厨师s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("厨师", 3)); //所有的工作人员都是一个线程 传菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("传菜员", 5)); //所有的工作人员都是一个线程 服务员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("服务员", 5)); //所有的工作人员都是一个线程 配菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("配菜员", 3)); //所有的工作人员都是一个线程 收银员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("收银员", 1)); //所有的工作人员都是一个线程 洗菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("洗菜员", 2)); table = new 客人[tableSize]; for (int i = 0; i < tableSize; i++) { Logger.Info("初始化餐桌 " + (i + 1) + " 号桌"); } } }}

每一个工作人员都是一个线程。模拟线程。

我们这里,餐厅配置:"厨师", 3"传菜员", 5 "服务员", 5 "配菜员", 3 "收银员", 1 "洗菜员", 2

各个环节的人员都不相同,且每一步操作都不进相同。

接下来我们初始化客人,

/** * * @author 失足程序员 * @Blog http://www.cnblogs.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 * */namespace Sz.Network.DiningRoom{ public class 客人 { public static EnumStatus Status入座 = new EnumStatus(1 << 0, 0x000000); public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000); public static EnumStatus Status点菜 = new EnumStatus(1 << 2, 0x000000); public static EnumStatus Status就餐 = new EnumStatus(1 << 3, 0x000000); public static EnumStatus Status结账中 = new EnumStatus(1 << 4, 0x000000); public static EnumStatus Status等待就餐 = new EnumStatus(1 << 5, 0x000000); public static EnumStatus Status等待结账 = new EnumStatus(1 << 6, 0x000000); /// <summary> /// 存储临时数据的 /// </summary> public ObjectAttribute TempAttribute = new ObjectAttribute(); /// <summary> /// 客人当前的状态 /// </summary> public EnumStatus Staus = new EnumStatus(0, 0x000000); public List<菜肴> 菜肴s = new List<菜肴>(); public int TableID { get; set; } /// <summary> /// 每一个客人的随机标识 /// </summary> public string guidID { get; set; } public 客人(int tableID) { guidID = Guid.NewGuid().ToString().Replace("-", ""); this.TableID = tableID; Staus |= Status入座; Show(); } public void 点菜() { ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, new Task点菜(this)); Task随机事件发生处理器 task = new Task随机事件发生处理器(this.TableID + " 号桌客人 上碗筷"); ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task); } public void Add点菜(菜肴 菜) { 菜肴s.Add(菜); ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.洗菜员s, new Task菜(this, 菜)); } public void Show() { string 状态 = ""; if (Staus.HasFlag(Status入座)) { 状态 = "入座"; } else if (Staus.HasFlag(Status取消)) { 状态 = "取消"; } else if (Staus.HasFlag(Status点菜)) { 状态 = "点菜"; } else if (Staus.HasFlag(Status等待就餐)) { 状态 = "等待就餐"; } else if (Staus.HasFlag(Status就餐)) { 状态 = "就餐"; } else if (Staus.HasFlag(Status等待结账)) { 状态 = "等待结账"; } else if (Staus.HasFlag(Status结账中)) { 状态 = "结账中"; } Logger.Info(this.TableID + " 号桌子 客人 " + this.guidID + " 当前状态:" + 状态); } }}

初始化菜肴

/** * * @author 失足程序员 * @Blog http://www.cnblogs.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 * */namespace Sz.Network.DiningRoom{ public class 菜肴 { public static EnumStatus Status点菜 = new EnumStatus(1 << 0, 0x000000); public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000); public static EnumStatus Status洗菜 = new EnumStatus(1 << 2, 0x000000); public static EnumStatus Status配菜 = new EnumStatus(1 << 3, 0x000000); public static EnumStatus Status炒菜 = new EnumStatus(1 << 4, 0x000000); public static EnumStatus Status传菜 = new EnumStatus(1 << 5, 0x000000); public static EnumStatus Status就餐 = new EnumStatus(1 << 6, 0x000000); public static EnumStatus Status结束就餐 = new EnumStatus(1 << 7, 0x000000); public string Name { get; private set; } public EnumStatus Staus = new EnumStatus(0, 0x000000); /// <summary> /// 存储临时数据的 /// </summary> public ObjectAttribute TempAttribute = new ObjectAttribute(); public 菜肴(string name) { this.Name = name; Staus |= Status点菜; Show(); } public void Show() { string 状态 = ""; if (Staus.HasFlag(Status点菜)) { 状态 = "点菜"; } else if (Staus.HasFlag(Status取消)) { 状态 = "取消"; } else if (Staus.HasFlag(Status洗菜)) { 状态 = "洗菜"; } else if (Staus.HasFlag(Status配菜)) { 状态 = "配菜"; } else if (Staus.HasFlag(Status炒菜)) { 状态 = "炒菜"; } else if (Staus.HasFlag(Status传菜)) { 状态 = "传菜"; } else if (Staus.HasFlag(Status就餐)) { 状态 = "就餐"; } Logger.Info(this.Name + " 当前状态:" + 状态); } }}

我们需要创建一个定时器任务,对餐桌和客人进行状态监测和随机事件发生器

/** * * @author 失足程序员 * @Blog http://www.cnblogs.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 * */namespace Sz.Network.DiningRoom{ public class TimerTask : ThreadPool.TimerTask { /// <summary> /// 间隔 5000 毫秒执行一次 /// </summary> public TimerTask() : base(餐厅.GetInstance.全局线程, 2000) { } public override void Run() { IEnumerable<IScript餐桌检查器> checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances<IScript餐桌检查器>(); foreach (var item in checkScripts) { item.Run(); } } }}

由于我们餐桌检查器是一个不定数,所以需要放到脚本去。方便更新程序代码。

在脚本项目里面创建脚本文件

/** * * @author 失足程序员 * @Blog http://www.cnblogs.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 * */namespace Sz.Netwo

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有