新聞中心
程序當然不能做飯。

之前的我們的系列文章,介紹, 多線程執(zhí)行,任務派發(fā)。定時器執(zhí)行。腳本加載。程序狀態(tài)機。
這些都是零零散散,或者說都是模塊化介紹,以及模塊測試用例。
那么今天我們就來模擬正常程序流程。使用上述的功能性代碼完成流程。
當然今天的測試用例程序肯定和做飯有關。今天要做的是模擬一個餐廳的流程。
完成 客人入座 -> 點菜 -> 等待就餐 -> 就餐 -> 等待結賬 -> 結賬 -> 離開.
期間包括 等待就餐 添加茶水,就餐的添加茶水,添加米飯等隨機事件
新建控制臺項目:
Sz.Network.DiningRoom 用于存放主文件項目
類庫
Sz.Network.DiningRoom.Scripts 用于存放腳本文件項目
我們先來初始化餐廳。
- /**
- *
- * @author 失足程序員
- * @Blog http://www.cnblogs.com/ty408/
- * @mail [email protected]
- * @phone 13882122019
- *
- */
- namespace Sz.Network.DiningRoom
- {
- ///
- ///
- ///
- 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
各個環(huán)節(jié)的人員都不相同,且每一步操作都不進相同。
接下來我們初始化客人,
- /**
- *
- * @author 失足程序員
- * @Blog http://www.cnblogs.com/ty408/
- * @mail [email protected]
- * @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);
- ///
- /// 存儲臨時數(shù)據(jù)的
- ///
- public ObjectAttribute TempAttribute = new ObjectAttribute();
- ///
- /// 客人當前的狀態(tài)
- ///
- public EnumStatus Staus = new EnumStatus(0, 0x000000);
- public List<菜肴> 菜肴s = new List<菜肴>();
- public int TableID { get; set; }
- ///
- /// 每一個客人的隨機標識
- ///
- 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隨機事件發(fā)生處理器 task = new Task隨機事件發(fā)生處理器(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 狀態(tài) = "";
- if (Staus.HasFlag(Status入座))
- {
- 狀態(tài) = "入座";
- }
- else if (Staus.HasFlag(Status取消))
- {
- 狀態(tài) = "取消";
- }
- else if (Staus.HasFlag(Status點菜))
- {
- 狀態(tài) = "點菜";
- }
- else if (Staus.HasFlag(Status等待就餐))
- {
- 狀態(tài) = "等待就餐";
- }
- else if (Staus.HasFlag(Status就餐))
- {
- 狀態(tài) = "就餐";
- }
- else if (Staus.HasFlag(Status等待結賬))
- {
- 狀態(tài) = "等待結賬";
- }
- else if (Staus.HasFlag(Status結賬中))
- {
- 狀態(tài) = "結賬中";
- }
- Logger.Info(this.TableID + " 號桌子 客人 " + this.guidID + " 當前狀態(tài):" + 狀態(tài));
- }
- }
- }
#p#
初始化菜肴
- /**
- *
- * @author 失足程序員
- * @Blog http://www.cnblogs.com/ty408/
- * @mail [email protected]
- * @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);
- ///
- /// 存儲臨時數(shù)據(jù)的
- ///
- public ObjectAttribute TempAttribute = new ObjectAttribute();
- public 菜肴(string name)
- {
- this.Name = name;
- Staus |= Status點菜;
- Show();
- }
- public void Show()
- {
- string 狀態(tài) = "";
- if (Staus.HasFlag(Status點菜))
- {
- 狀態(tài) = "點菜";
- }
- else if (Staus.HasFlag(Status取消))
- {
- 狀態(tài) = "取消";
- }
- else if (Staus.HasFlag(Status洗菜))
- {
- 狀態(tài) = "洗菜";
- }
- else if (Staus.HasFlag(Status配菜))
- {
- 狀態(tài) = "配菜";
- }
- else if (Staus.HasFlag(Status炒菜))
- {
- 狀態(tài) = "炒菜";
- }
- else if (Staus.HasFlag(Status傳菜))
- {
- 狀態(tài) = "傳菜";
- }
- else if (Staus.HasFlag(Status就餐))
- {
- 狀態(tài) = "就餐";
- }
- Logger.Info(this.Name + " 當前狀態(tài):" + 狀態(tài));
- }
- }
- }
我們需要創(chuàng)建一個定時器任務,對餐桌和客人進行狀態(tài)監(jiān)測和隨機事件發(fā)生器
- /**
- *
- * @author 失足程序員
- * @Blog http://www.cnblogs.com/ty408/
- * @mail [email protected]
- * @phone 13882122019
- *
- */
- namespace Sz.Network.DiningRoom
- {
- public class TimerTask : ThreadPool.TimerTask
- {
- ///
- /// 間隔 5000 毫秒執(zhí)行一次
- ///
- public TimerTask()
- : base(餐廳.GetInstance.全局線程, 2000)
- {
- }
- public override void Run()
- {
- IEnumerable
checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances (); - foreach (var item in checkScripts)
- {
- item.Run();
- }
- }
- }
- }
由于我們餐桌檢查器是一個不定數(shù),所以需要放到腳本去。方便更新程序代碼。
#p#
在腳本項目里面創(chuàng)建腳本文件
- /**
- *
- * @author 失足程序員
- * @Blog http://www.cnblogs.com/ty408/
- * @mail [email protected]
- * @phone 13882122019
- *
- */
- namespace Sz.Network.DiningRoom.Scripts
- {
- public class Script餐桌檢查器 : IScript餐桌檢查器
- {
- Random random = new Random(DateTime.Now.Millisecond);
- public Script餐桌檢查器()
- {
- }
- public void Run()
- {
- Logger.Info("==================================Script餐桌檢查器=======================================");
- for (int i = 0; i < 餐廳.GetInstance.table.Length; i++)
- {
- if (餐廳.GetInstance.table[i] == null)
- {
- int randomValue = random.Next(10000);
- if (randomValue < 5000)
- {
- 客人 客 = new 客人(i + 1);
- 餐廳.GetInstance.table[i] = 客;
- }
- }
- else
- {
- 客人 客 = 餐廳.GetInstance.table[i];
- if (客.Staus.HasFlag(客人.Status入座))
- {
- ///如果客人剛剛入座,執(zhí)行點菜,移交給服務員
- 客.Staus |= 客人.Status點菜;
- 客.點菜();
- }
- else if (客.Staus.HasFlag(客人.Status等待就餐))
- {
- bool isFor = true;
- foreach (var item in 客.菜肴s)
- {
- if (!item.Staus.HasFlag(菜肴.Status就餐))
- {
- isFor = false;
- break;
- }
- }
- if (isFor)
- {
- 客.Staus |= 客人.Status就餐;
- //模擬客人吃飯需要30到50秒
- 客.TempAttribute["Status就餐"] = SzExtensions.CurrentTimeMillis() + (random.Next(3, 6)) * 10 * 1000;
- }
- else
- {
- //模擬隨機事件
- int randomValue = random.Next(10000);
- if (randomValue < 6000)
- {
- Logger.Info("隨機事件發(fā)生 " + (i + 1) + " 號桌客人 添加茶水");
- Task隨機事件發(fā)生處理器 task = new Task隨機事件發(fā)生處理器((i + 1) + " 號桌客人 添加茶水");
- ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.服務員s, task);
- }
- }
- }
- else if (客.Staus.HasFlag(客人.Status就餐))
- {
- if (客.TempAttribute.GetlongValue("Status就餐") < SzExtensions.CurrentTimeMillis())
- {
- 客.Staus |= 客人.Status等待結賬;
- }
- else
- {
- //模擬隨機事件
- string msg = "";
- int randomValue = random.Next(10000);
- if (randomValue < 3000)
- {
- msg = " 添加米飯";
- }
- else if (randomValue < 6000)
- {
- msg = " 添加茶水";
- }
- if (!string.IsNullOrWhiteSpace(msg))
- {
- Logger.Info("隨機事件發(fā)生 " + (i + 1) + " 號桌客人 " + msg);
- Task隨機事件發(fā)生處理器 task = new Task隨機事件發(fā)生處理器((i + 1) + " 號桌客人 " + msg);
- ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.服務員s, task);
- }
- }
- }
- else if (客.Staus.HasFlag(客人.Status等待結賬))
- {
- 客.Staus |= 客人.Status結賬中;
- }
- else if (客.Staus.HasFlag(客人.Status結賬中))
- {
- Logger.Info((i + 1) + " 號桌客人 結束就餐 送走客人");
- 餐廳.GetInstance.table[i] = null;
- return;
- }
- 客.Show();
- }
- }
- }
- }
- }
點菜也同樣為方便程序更新,代碼放在腳本執(zhí)行
- /**
- *
- * @author 失足程序員
- * @Blog http://www.cnblogs.com/ty408/
- * @mail [email protected]
- * @phone 13882122019
- *
- */
- namespace Sz.Network.DiningRoom.Scripts
- {
- public class Script點菜 : IScript點菜
- {
- public Script點菜()
- {
- }
- public void Run(客人 客)
- {
- List
菜肴_葷菜s = new List () { "回鍋肉", "青椒肉絲", "東坡肘子", "糖醋排骨", "魚香肉絲" }; - List
菜肴_素菜s = new List () { "空心菜", "鳳尾", "素炒竹筍", "白油絲瓜" }; - List
菜肴_湯s = new List () { "番茄煎蛋湯", "紫菜蛋花湯", "酸菜粉絲湯", "素菜湯", "肉片湯" }; - Random random = new Random(DateTime.Now.Millisecond);
- {
- //int 數(shù)量 = random.Next(1, 菜肴_葷菜s.Count);
- &n
網(wǎng)站題目:你程序會做飯嘛?我其實是這樣做的
網(wǎng)站URL:http://m.fisionsoft.com.cn/article/cdeioep.html


咨詢
建站咨詢
