別嘲笑這個標題。我想了很久。有點“投機取巧”的功效吧!
程序當然不能做飯。
之前的我們的系列文章,介紹, 多線程執行,任務派發。定時器執行。腳本加載。程序狀態機。
這些都是零零散散,或者說都是模塊化介紹,以及模塊測試用例。
那么今天我們就來模擬正常程序流程。使用上述的功能性代碼完成流程。
當然今天的測試用例程序肯定和做飯有關。今天要做的是模擬一個餐廳的流程。
完成 客人入座 -> 點菜 -> 等待就餐 -> 就餐 -> 等待結賬 -> 結賬 -> 離開.
期間包括 等待就餐 添加茶水,就餐的添加茶水,添加米飯等隨機事件
新建控制臺項目:
Sz.Network.DiningRoom 用于存放主文件項目
類庫
Sz.Network.DiningRoom.Scripts 用于存放腳本文件項目
我們先來初始化餐廳。
/** * * @author 失足程序員 * @Blog http://m.survivalescaperooms.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://m.survivalescaperooms.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://m.survivalescaperooms.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://m.survivalescaperooms.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://m.survivalescaperooms.com/ty408/ * @mail 492794628@qq.com * @phone 13882122019 * */namespace Sz.Netwo
新聞熱點
疑難解答