91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
你程序會做飯嘛?我其實是這樣做的

程序當然不能做飯。

之前的我們的系列文章,介紹, 多線程執(zhí)行,任務派發(fā)。定時器執(zhí)行。腳本加載。程序狀態(tài)機。

這些都是零零散散,或者說都是模塊化介紹,以及模塊測試用例。

那么今天我們就來模擬正常程序流程。使用上述的功能性代碼完成流程。

當然今天的測試用例程序肯定和做飯有關。今天要做的是模擬一個餐廳的流程。

完成 客人入座 -> 點菜 -> 等待就餐 -> 就餐 -> 等待結賬 -> 結賬 -> 離開.

期間包括 等待就餐 添加茶水,就餐的添加茶水,添加米飯等隨機事件

新建控制臺項目:

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

類庫

Sz.Network.DiningRoom.Scripts  用于存放腳本文件項目

我們先來初始化餐廳。

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序員
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     /// 
  12.     /// 
  13.     /// 
  14.     public class 餐廳
  15.     {
  16.         private static 餐廳 instance = new 餐廳();
  17.         public static 餐廳 GetInstance { get { return instance; } }
  18.         public long 全局線程 = 0;
  19.         public long 廚師s = 0;
  20.         public long 傳菜員s = 0;
  21.         public long 服務員s = 0;
  22.         public long 配菜員s = 0;
  23.         public long 收銀員s = 0;
  24.         public long 洗菜員s = 0;
  25.         public 客人[] table = null;
  26.         public void Init(int tableSize)
  27.         {
  28.             Logger.Info("初始化餐廳");
  29.             //所有的工作人員都是一個線程
  30.             全局線程 = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("全局線程", 1));
  31.             //所有的工作人員都是一個線程
  32.             廚師s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("廚師", 3));
  33.             //所有的工作人員都是一個線程
  34.             傳菜員s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("傳菜員", 5));
  35.             //所有的工作人員都是一個線程
  36.             服務員s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("服務員", 5));
  37.             //所有的工作人員都是一個線程
  38.             配菜員s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("配菜員", 3));
  39.             //所有的工作人員都是一個線程
  40.             收銀員s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("收銀員", 1));
  41.             //所有的工作人員都是一個線程
  42.             洗菜員s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("洗菜員", 2));
  43.             table = new 客人[tableSize];
  44.             for (int i = 0; i < tableSize; i++)
  45.             {
  46.                 Logger.Info("初始化餐桌 " + (i + 1) + " 號桌");
  47.             }
  48.         }
  49.     }
  50. }

每一個工作人員都是一個線程。模擬線程。

我們這里,餐廳配置:"廚師", 3 "傳菜員", 5  "服務員", 5  "配菜員", 3  "收銀員", 1  "洗菜員", 2

各個環(huán)節(jié)的人員都不相同,且每一步操作都不進相同。

接下來我們初始化客人,

  
 
  1. /**
  2.  * 
  3.  * @author 失足程序員
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     public class 客人
  12.     {
  13.         public static EnumStatus Status入座 = new EnumStatus(1 << 0, 0x000000);
  14.         public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000);
  15.         public static EnumStatus Status點菜 = new EnumStatus(1 << 2, 0x000000);
  16.         public static EnumStatus Status就餐 = new EnumStatus(1 << 3, 0x000000);
  17.         public static EnumStatus Status結賬中 = new EnumStatus(1 << 4, 0x000000);
  18.         public static EnumStatus Status等待就餐 = new EnumStatus(1 << 5, 0x000000);
  19.         public static EnumStatus Status等待結賬 = new EnumStatus(1 << 6, 0x000000);
  20.         /// 
  21.         /// 存儲臨時數據的
  22.         /// 
  23.         public ObjectAttribute TempAttribute = new ObjectAttribute();
  24.         /// 
  25.         /// 客人當前的狀態(tài)
  26.         /// 
  27.         public EnumStatus Staus = new EnumStatus(0, 0x000000);
  28.         public List<菜肴> 菜肴s = new List<菜肴>();
  29.         public int TableID { get; set; }
  30.         /// 
  31.         /// 每一個客人的隨機標識
  32.         /// 
  33.         public string guidID { get; set; }
  34.         public 客人(int tableID)
  35.         {
  36.             guidID = Guid.NewGuid().ToString().Replace("-", "");
  37.             this.TableID = tableID;
  38.             Staus |= Status入座;
  39.             Show();
  40.         }
  41.         public void 點菜()
  42.         {
  43.             ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.服務員s, new Task點菜(this));
  44.             Task隨機事件發(fā)生處理器 task = new Task隨機事件發(fā)生處理器(this.TableID + " 號桌客人 上碗筷");
  45.             ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.服務員s, task);
  46.         }
  47.         public void Add點菜(菜肴 菜)
  48.         {
  49.             菜肴s.Add(菜);
  50.             ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.洗菜員s, new Task菜(this, 菜));
  51.         }
  52.         public void Show()
  53.         {
  54.             string 狀態(tài) = "";
  55.             if (Staus.HasFlag(Status入座))
  56.             {
  57.                 狀態(tài) = "入座";
  58.             }
  59.             else if (Staus.HasFlag(Status取消))
  60.             {
  61.                 狀態(tài) = "取消";
  62.             }
  63.             else if (Staus.HasFlag(Status點菜))
  64.             {
  65.                 狀態(tài) = "點菜";
  66.             }
  67.             else if (Staus.HasFlag(Status等待就餐))
  68.             {
  69.                 狀態(tài) = "等待就餐";
  70.             }
  71.             else if (Staus.HasFlag(Status就餐))
  72.             {
  73.                 狀態(tài) = "就餐";
  74.             }
  75.             else if (Staus.HasFlag(Status等待結賬))
  76.             {
  77.                 狀態(tài) = "等待結賬";
  78.             }
  79.             else if (Staus.HasFlag(Status結賬中))
  80.             {
  81.                 狀態(tài) = "結賬中";
  82.             }
  83.             Logger.Info(this.TableID + " 號桌子 客人 " + this.guidID + " 當前狀態(tài):" + 狀態(tài));
  84.         }
  85.     }
  86. }

#p#

初始化菜肴

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序員
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     public class 菜肴
  12.     {
  13.         public static EnumStatus Status點菜 = new EnumStatus(1 << 0, 0x000000);
  14.         public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000);
  15.         public static EnumStatus Status洗菜 = new EnumStatus(1 << 2, 0x000000);
  16.         public static EnumStatus Status配菜 = new EnumStatus(1 << 3, 0x000000);
  17.         public static EnumStatus Status炒菜 = new EnumStatus(1 << 4, 0x000000);
  18.         public static EnumStatus Status傳菜 = new EnumStatus(1 << 5, 0x000000);
  19.         public static EnumStatus Status就餐 = new EnumStatus(1 << 6, 0x000000);
  20.         public static EnumStatus Status結束就餐 = new EnumStatus(1 << 7, 0x000000);
  21.         public string Name { get; private set; }
  22.         public EnumStatus Staus = new EnumStatus(0, 0x000000);
  23.         /// 
  24.         /// 存儲臨時數據的
  25.         /// 
  26.         public ObjectAttribute TempAttribute = new ObjectAttribute();
  27.         public 菜肴(string name)
  28.         {
  29.             this.Name = name;
  30.             Staus |= Status點菜;
  31.             Show();
  32.         }
  33.         public void Show()
  34.         {
  35.             string 狀態(tài) = "";
  36.             if (Staus.HasFlag(Status點菜))
  37.             {
  38.                 狀態(tài) = "點菜";
  39.             }
  40.             else if (Staus.HasFlag(Status取消))
  41.             {
  42.                 狀態(tài) = "取消";
  43.             }
  44.             else if (Staus.HasFlag(Status洗菜))
  45.             {
  46.                 狀態(tài) = "洗菜";
  47.             }
  48.             else if (Staus.HasFlag(Status配菜))
  49.             {
  50.                 狀態(tài) = "配菜";
  51.             }
  52.             else if (Staus.HasFlag(Status炒菜))
  53.             {
  54.                 狀態(tài) = "炒菜";
  55.             }
  56.             else if (Staus.HasFlag(Status傳菜))
  57.             {
  58.                 狀態(tài) = "傳菜";
  59.             }
  60.             else if (Staus.HasFlag(Status就餐))
  61.             {
  62.                 狀態(tài) = "就餐";
  63.             }
  64.             Logger.Info(this.Name + " 當前狀態(tài):" + 狀態(tài));
  65.         }
  66.     }
  67. }

我們需要創(chuàng)建一個定時器任務,對餐桌和客人進行狀態(tài)監(jiān)測和隨機事件發(fā)生器

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序員
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom
  10. {
  11.     public class TimerTask : ThreadPool.TimerTask
  12.     {
  13.         /// 
  14.         /// 間隔 5000 毫秒執(zhí)行一次
  15.         /// 
  16.         public TimerTask()
  17.             : base(餐廳.GetInstance.全局線程, 2000)
  18.         {
  19.         }
  20.         public override void Run()
  21.         {           
  22.             IEnumerable checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances();
  23.             foreach (var item in checkScripts)
  24.             {
  25.                 item.Run();
  26.             }
  27.         }
  28.     }
  29. }

由于我們餐桌檢查器是一個不定數,所以需要放到腳本去。方便更新程序代碼。

#p#

在腳本項目里面創(chuàng)建腳本文件

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序員
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom.Scripts
  10. {
  11.     public class Script餐桌檢查器 : IScript餐桌檢查器
  12.     {
  13.         Random random = new Random(DateTime.Now.Millisecond);
  14.         public Script餐桌檢查器()
  15.         {
  16.         }
  17.         public void Run()
  18.         {
  19.             Logger.Info("==================================Script餐桌檢查器=======================================");
  20.             for (int i = 0; i < 餐廳.GetInstance.table.Length; i++)
  21.             {
  22.                 if (餐廳.GetInstance.table[i] == null)
  23.                 {
  24.                     int randomValue = random.Next(10000);
  25.                     if (randomValue < 5000)
  26.                     {
  27.                         客人 客 = new 客人(i + 1);
  28.                         餐廳.GetInstance.table[i] = 客;
  29.                     }
  30.                 }
  31.                 else
  32.                 {
  33.                     客人 客 = 餐廳.GetInstance.table[i];
  34.                     if (客.Staus.HasFlag(客人.Status入座))
  35.                     {
  36.                         ///如果客人剛剛入座,執(zhí)行點菜,移交給服務員
  37.                         客.Staus |= 客人.Status點菜;
  38.                         客.點菜();
  39.                     }
  40.                     else if (客.Staus.HasFlag(客人.Status等待就餐))
  41.                     {
  42.                         bool isFor = true;
  43.                         foreach (var item in 客.菜肴s)
  44.                         {
  45.                             if (!item.Staus.HasFlag(菜肴.Status就餐))
  46.                             {
  47.                                 isFor = false;
  48.                                 break;
  49.                             }
  50.                         }
  51.                         if (isFor)
  52.                         {
  53.                             客.Staus |= 客人.Status就餐;
  54.                             //模擬客人吃飯需要30到50秒
  55.                             客.TempAttribute["Status就餐"] = SzExtensions.CurrentTimeMillis() + (random.Next(3, 6)) * 10 * 1000;
  56.                         }
  57.                         else
  58.                         {
  59.                             //模擬隨機事件
  60.                             int randomValue = random.Next(10000);
  61.                             if (randomValue < 6000)
  62.                             {
  63.                                 Logger.Info("隨機事件發(fā)生 " + (i + 1) + " 號桌客人 添加茶水");
  64.                                 Task隨機事件發(fā)生處理器 task = new Task隨機事件發(fā)生處理器((i + 1) + " 號桌客人 添加茶水");
  65.                                 ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.服務員s, task);
  66.                             }
  67.                         }
  68.                     }
  69.                     else if (客.Staus.HasFlag(客人.Status就餐))
  70.                     {
  71.                         if (客.TempAttribute.GetlongValue("Status就餐") < SzExtensions.CurrentTimeMillis())
  72.                         {
  73.                             客.Staus |= 客人.Status等待結賬;
  74.                         }
  75.                         else
  76.                         {
  77.                             //模擬隨機事件
  78.                             string msg = "";
  79.                             int randomValue = random.Next(10000);
  80.                             if (randomValue < 3000)
  81.                             {
  82.                                 msg = " 添加米飯";
  83.                             }
  84.                             else if (randomValue < 6000)
  85.                             {
  86.                                 msg = " 添加茶水";
  87.                             }
  88.                             if (!string.IsNullOrWhiteSpace(msg))
  89.                             {
  90.                                 Logger.Info("隨機事件發(fā)生 " + (i + 1) + " 號桌客人 " + msg);
  91.                                 Task隨機事件發(fā)生處理器 task = new Task隨機事件發(fā)生處理器((i + 1) + " 號桌客人 " + msg);
  92.                                 ThreadPool.ThreadManager.GetInstance.AddTask(餐廳.GetInstance.服務員s, task);
  93.                             }
  94.                         }
  95.                     }
  96.                     else if (客.Staus.HasFlag(客人.Status等待結賬))
  97.                     {
  98.                         客.Staus |= 客人.Status結賬中;
  99.                     }
  100.                     else if (客.Staus.HasFlag(客人.Status結賬中))
  101.                     {
  102.                         Logger.Info((i + 1) + " 號桌客人 結束就餐 送走客人");
  103.                         餐廳.GetInstance.table[i] = null;
  104.                         return;
  105.                     }
  106.                     客.Show();
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }

點菜也同樣為方便程序更新,代碼放在腳本執(zhí)行

 
 
  1. /**
  2.  * 
  3.  * @author 失足程序員
  4.  * @Blog http://www.cnblogs.com/ty408/
  5.  * @mail 492794628@qq.com
  6.  * @phone 13882122019
  7.  * 
  8.  */
  9. namespace Sz.Network.DiningRoom.Scripts
  10. {
  11.     public class Script點菜 : IScript點菜
  12.     {
  13.         public Script點菜()
  14.         {
  15.         }
  16.         public void Run(客人 客)
  17.         {
  18.             List 菜肴_葷菜s = new List() { "回鍋肉", "青椒肉絲", "東坡肘子", "糖醋排骨", "魚香肉絲" };
  19.             List 菜肴_素菜s = new List() { "空心菜", "鳳尾", "素炒竹筍", "白油絲瓜" };
  20.             List 菜肴_湯s = new List() { "番茄煎蛋湯", "紫菜蛋花湯", "酸菜粉絲湯", "素菜湯", "肉片湯" };
  21.             Random random = new Random(DateTime.Now.Millisecond);
  22.             {
  23.                 //int 數量 = random.Next(1, 菜肴_葷菜s.Count);
  24.    &n
    網頁題目:你程序會做飯嘛?我其實是這樣做的
    鏈接URL:http://m.jiaoqi3.com/article/cdeioep.html