Browse Source

加入阻塞队列,测试未通过

yc_t 7 năm trước cách đây
mục cha
commit
f4f213ad7a

+ 9 - 3
Queuing/App.config

@@ -1,6 +1,12 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
-    </startup>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
+  </startup>
+  <appSettings>
+    <!--停取车比例-->
+    <add key="fetch_store_ratio" value="3"/>
+    <!--Web ip配置-->
+    <add key="WebConfig" value="127.0.0.1:9000"/>
+  </appSettings>
 </configuration>

+ 70 - 64
Queuing/Program.cs

@@ -6,72 +6,73 @@ using System.Threading;
 using System.Threading.Tasks;
 using parkMonitor.entity;
 using parkMonitor.server.CoreThread;
+using parkMonitor.server.WebThread;
 
 namespace Queuing
 {
-    class SimulWeb : IEquipments
-    {
-        bool isClosing = false;
-        Random rnd;
-        Command cmd;
-        string[] licenses = { "京PH3X00", "京PH3X11", "京PH3X22", "京PH3X33", "京PH3X44", "京PH3X55" };
-        int licCount = 6;
+    //class SimulWeb : IEquipments
+    //{
+    //    bool isClosing = false;
+    //    Random rnd;
+    //    Command cmd;
+    //    string[] licenses = { "京PH3X00", "京PH3X11", "京PH3X22", "京PH3X33", "京PH3X44", "京PH3X55" };
+    //    int licCount = 6;
 
-        private void Run()
-        {
-            while (!isClosing)
-            {
-                if (cmd != null && cmd.LicenseNum == "" && licCount>0)
-                {
-                    cmd.LicenseNum = licenses[licenses.Length - (licCount--)];
-                    if (rnd.Next(0, 4) >= 4)
-                        cmd.command = EnumCommand.Fetch;
-                    else
-                        cmd.command = EnumCommand.Store;
-                    cmd.recordingTime = DateTime.Now.Millisecond;
-                }
-                Thread.Sleep(3000);
-            }
-        }
+    //    private void Run()
+    //    {
+    //        while (!isClosing)
+    //        {
+    //            if (cmd != null && cmd.LicenseNum == "" && licCount > 0)
+    //            {
+    //                cmd.LicenseNum = licenses[licenses.Length - (licCount--)];
+    //                if (rnd.Next(0, 4) >= 4)
+    //                    cmd.command = EnumCommand.Fetch;
+    //                else
+    //                    cmd.command = EnumCommand.Store;
+    //                cmd.TimeRecord = DateTime.Now.Millisecond;
+    //            }
+    //            Thread.Sleep(3000);
+    //        }
+    //    }
 
-        public AbstractMessage GetMessage()
-        {
-            return cmd;
-        }
+    //    public AbstractMessage GetMessage()
+    //    {
+    //        return cmd;
+    //    }
 
-        public void SetMessage(AbstractMessage message)
-        {
+    //    public void SetMessage(AbstractMessage message)
+    //    {
 
-        }
+    //    }
 
-        public void Start()
-        {
-            isClosing = false;
-            rnd = new Random();
-            cmd = new Command();
-            Task.Factory.StartNew(() =>
-            {
-                Run();
-            });
-        }
+    //    public void Start()
+    //    {
+    //        isClosing = false;
+    //        rnd = new Random();
+    //        cmd = new Command();
+    //        Task.Factory.StartNew(() =>
+    //        {
+    //            Run();
+    //        });
+    //    }
 
-        public void Stop()
-        {
-            isClosing = true;
-        }
-    }
+    //    public void Stop()
+    //    {
+    //        isClosing = true;
+    //    }
+    //}
 
     class SimulNum : IEquipments
     {
         bool isClosing;
-        string[] licenses = { "京PH3X55", "京PH3X44", "京PH3X33", "京PH3X22", "京PH3X11", "京PH3X00" };
+        string[] licenses = { "京PH3X00", "京PBS362", "粤CKC236", "川AT0H69" };
         NumberMachineMessage nmm;
-        int licCount = 6;
+        int licCount = 4;
         private void Run()
         {
             while (!isClosing)
             {
-                if (nmm != null && (nmm.aModel == null || nmm.aModel.ip == "") && licCount>0)
+                if (nmm != null && (nmm.aModel == null || nmm.aModel.ip == "") && licCount > 0)
                 {
                     if (nmm.aModel == null)
                         nmm.aModel = new NumberMachineNode();
@@ -108,37 +109,42 @@ namespace Queuing
         }
     }
 
-
     class Program
     {
         static void Main(string[] args)
         {
-            SimulWeb sw = new SimulWeb();
+            CentralForWeb cfw = new CentralForWeb();
             SimulNum sn = new SimulNum();
             QueuingThread qt = new QueuingThread();
-            sw.Start();
+            cfw.Start();
             sn.Start();
-            qt.webHandle = sw;
+            qt.webHandle = cfw;
             qt.numMachineHandle = sn;
             qt.Start();
-            int count = 6;
+            int count = 4;
+            Command cmd = null;
             Task.Factory.StartNew(() =>
             {
-                while (count-- > 0)
+                cmd = (Command)qt.GetMessage();
+            });
+
+            Task.Factory.StartNew(() =>
+            {
+            while (count-- > 0)
+            {
+                while (true)
                 {
-                    while (true)
+                    if (cmd != null)
                     {
-                        Command cmd = (Command)qt.GetMessage();
-                        if (cmd != null)
-                        {
-                            Console.WriteLine("输出号牌为:" + cmd.LicenseNum);
-                            cmd.LicenseNum = "";
-                            break;
-                        }
+                        Console.WriteLine("输出号牌为:" + cmd.LicenseNum);
+                        cmd.LicenseNum = "";
+                        break;
                     }
-                    Console.WriteLine("第" + count + "轮循环");
+                        Thread.Sleep(500);
                 }
-            });
+                Console.WriteLine("第" + count + "轮循环");
+            }
+        });
             Console.ReadLine();
         }
     }

+ 9 - 0
Queuing/Queuing.csproj

@@ -32,7 +32,11 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Newtonsoft.Json">
+      <HintPath>..\parkMonitor\sdk\HslCommunication\Newtonsoft.Json.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
@@ -47,6 +51,11 @@
     <Compile Include="queue\AbstractMessage.cs" />
     <Compile Include="queue\Equipments.cs" />
     <Compile Include="queue\QueuingThread.cs" />
+    <Compile Include="tools\BlockingQueue.cs" />
+    <Compile Include="tools\JsonByByteToObjectTools.cs" />
+    <Compile Include="WebThread\CentralForWebSocketServer.cs" />
+    <Compile Include="WebThread\LazySingleton.cs" />
+    <Compile Include="WebThread\MultiSocketThread.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />

+ 76 - 0
Queuing/WebThread/CentralForWebSocketServer.cs

@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using parkMonitor.entity;
+using System.Configuration;
+using System.Net.Sockets;
+using System.Net;
+using System.Threading;
+using parkMonitor.tools;
+
+namespace parkMonitor.server.WebThread
+{
+    public class CentralForWeb : IEquipments
+    {
+        public MultiSocketThread multiSocketThread { set; get; }
+        public static BlockingQueue blockingQueue = new BlockingQueue();
+
+        public AbstractMessage GetMessage()
+        {
+            return (AbstractMessage)blockingQueue.Dequeue();
+        }
+        public void SetMessage(AbstractMessage message)
+        {
+            //multiSocketThread.SendMessage(message);
+        }
+
+        public void Start()
+        {
+            string strTemp = ConfigurationManager.AppSettings["WebConfig"];
+            string[] strArray = strTemp.Split(':');
+            string ipstr = strArray[0];
+            string portstr = strArray[1];
+
+            Int32 port = Convert.ToInt32(portstr);
+            IPAddress localAddr = IPAddress.Parse(ipstr);
+
+            TcpListener listern = LazySingleton.GetInstance(localAddr, port);
+            listern.Start();
+
+            Thread thread = new Thread(() =>
+            {
+                while (true)
+                {
+                    try
+                    {
+                        //得到包含客户端信息的套接字                
+                        var tcpClient = listern.AcceptTcpClient();
+                        //创建消息服务线程对象 
+                        //把multiSocket类的run方法委托给线程  
+                        multiSocketThread = new MultiSocketThread(tcpClient);
+                        Task.Factory.StartNew(()=> {
+                            multiSocketThread.Run();
+                        });
+                        //Thread newThread = new Thread(multiSocketThread.Run);
+                        //newThread.IsBackground = true;
+                        //newThread.Start();
+                    }
+                    catch (Exception e)
+                    {
+                        Stop();
+                        Console.WriteLine(e.Message);
+                    }
+                    Thread.Sleep(500);
+                }
+            });
+            thread.IsBackground = true;
+            thread.Start();
+        }
+        public void Stop()
+        {
+            multiSocketThread.Close();
+        }
+    }
+}

+ 37 - 0
Queuing/WebThread/LazySingleton.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace parkMonitor.server.WebThread
+{
+    class LazySingleton
+    {
+        private static TcpListener listener = null;
+       
+        private static readonly object syncRoot = new object();
+        private LazySingleton()
+        { 
+        }
+        public static TcpListener GetInstance(IPAddress localAddr,Int32 port)
+        {
+            //第一重判断,先判断实例是否存在,不存在再加锁处理  
+            if (listener == null)
+            {
+                //加锁的程序在某一时刻只允许一个线程访问  
+                lock (syncRoot)
+                {
+                    //第二重判断  
+                    if (listener == null)
+                    {
+                        listener = new TcpListener(localAddr, port);  //创建单例实例  
+                    }
+                }
+            }
+            return listener;
+        }  
+    }
+}

+ 70 - 0
Queuing/WebThread/MultiSocketThread.cs

@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+
+using parkMonitor.Tools;
+using parkMonitor.entity;
+
+namespace parkMonitor.server.WebThread
+{
+    public class MultiSocketThread
+    {
+        public TcpClient tcpClient { get; set; }
+        public NetworkStream ns { get; set; }
+        private MessageUTF8 message = null;
+
+        public MultiSocketThread(TcpClient tcpClient)
+        {
+            this.tcpClient = tcpClient;
+            ns = tcpClient.GetStream();
+            message = new MessageUTF8();
+            message.cmd = '0';
+        }
+
+        public MultiSocketThread()
+        {
+            // TODO: Complete member initialization
+        }
+
+        public void SendMessage(AbstractMessage message)
+        {
+            byte[] byteMessage = JsonByByteToObjectTools.ObjToJsonByte(message);
+            ns.Write(byteMessage, 0, byteMessage.Length);
+            ns.Flush();
+        }
+
+        public AbstractMessage ReceiverMessage()
+        {
+            try
+            {
+                byte[] bytes = new byte[256];
+                int bytesRead = ns.Read(bytes, 0, bytes.Length);
+                message = (MessageUTF8)JsonByByteToObjectTools.JsonByteToObj<MessageUTF8>(bytes);
+                ns.Flush();
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e.Message);
+            }
+            return message;
+        }
+
+        public void Run()
+        {
+            SendMessage(message);
+
+            MessageUTF8 msg = (MessageUTF8)ReceiverMessage();
+
+            CentralForWeb.blockingQueue.Enqueue(msg);
+            
+        }
+        public void Close()
+        {
+            ns.Close();
+        }
+
+    }
+}

+ 25 - 49
Queuing/queue/AbstractMessage.cs

@@ -5,40 +5,36 @@ namespace parkMonitor.entity
 {
     public abstract class AbstractMessage
     {
-        //public abstract bool Set(AbstractMessage msg);
     }
 
     //web
-    public class MessageUTF8 : AbstractMessage
+    public class MessageUTF8 : AbstractMessage,ICloneable
     {
         public char cmd { set; get; }
         public string context { set; get; }
         public string sender { set; get; }
         public string receiver { set; get; }
+        public int garageID { get; set; }
+
         public MessageUTF8()
         {
 
         }
-        public MessageUTF8(char cmd, string context, string sender, string receiver)
+
+        public MessageUTF8(char cmd, string context, string sender, string receiver, int garageID)
         {
             this.cmd = cmd;
             this.context = context;
             this.sender = sender;
             this.receiver = receiver;
+            this.garageID = garageID;
+        }
+
+        public object Clone()
+        {
+            MessageUTF8 webMsg = new MessageUTF8(this.cmd,this.context,this.sender,this.receiver,this.garageID);
+            return webMsg;
         }
-        //public override bool Set(AbstractMessage msg)
-        //{
-        //    if (!(msg.GetType().Equals(typeof(MessageUTF8))))
-        //        return false;
-        //    else
-        //    {
-        //        this.cmd = ((MessageUTF8)msg).cmd;
-        //        this.context = ((MessageUTF8)msg).context;
-        //        this.sender = ((MessageUTF8)msg).sender;
-        //        this.receiver = ((MessageUTF8)msg).receiver;
-        //        return true;
-        //    }
-        //}
     }
 
     //********************************************* plc ************************************************
@@ -162,16 +158,6 @@ namespace parkMonitor.entity
         {
             data = new List<NumberMachineNode>();
         }
-        //public override bool Set(AbstractMessage msg)
-        //{
-        //    if (!(msg.GetType().Equals(typeof(LicValue))))
-        //        return false;
-
-        //    data = ((LicValue)msg).data;
-        //    closing = ((LicValue)msg).closing;
-        //    //devPushed = ((LicValue)msg).devPushed;
-        //    return true;
-        //}
 
         public override bool Equals(System.Object obj)
         {
@@ -206,18 +192,6 @@ namespace parkMonitor.entity
             this.status = status;
             data = new Data();
         }
-        //public override bool Set(AbstractMessage msg)
-        //{
-        //    if (!(msg.GetType().Equals(typeof(LaserValue))))
-        //        return false;
-        //    else
-        //    {
-        //        id = ((LaserValue)msg).id;
-        //        status = ((LaserValue)msg).status;
-        //        data.Copy(((LaserValue)msg).data);
-        //        return true;
-        //    }
-        //}
 
         public object Clone()
         {
@@ -258,29 +232,31 @@ namespace parkMonitor.entity
     }
 
     //********************************************** command **********************************************
-    public enum EnumCommand
-    {
-        Fetch, Store
-    }
-
     public class Command:AbstractMessage,ICloneable
     {
+        public char commandType;
         public string LicenseNum;
-        public EnumCommand command;
-        public int recordingTime;
+        public string userID;
+        public int garageID;
+        public string TimeRecord;
 
         public Command()
         {
             LicenseNum = "";
-            command = EnumCommand.Fetch;
-            recordingTime = 0;
+            TimeRecord = "";
+            userID = "";
+            garageID = 0;
+            TimeRecord = "";
         }
+
         public object Clone()
         {
             Command cmdClone = new Command();
+            cmdClone.commandType = commandType;
             cmdClone.LicenseNum = LicenseNum;
-            cmdClone.command = command;
-            cmdClone.recordingTime = recordingTime;
+            cmdClone.userID = userID;
+            cmdClone.garageID = garageID;
+            cmdClone.TimeRecord = TimeRecord;
             return cmdClone;
         }
     }

+ 41 - 21
Queuing/queue/QueuingThread.cs

@@ -7,7 +7,9 @@ using System.Threading.Tasks;
 using parkMonitor.entity;
 using parkMonitor.server;
 using System.Configuration;
+using parkMonitor.tools;
 
+/*  需要utf8+numNode, 阻塞队列   */
 namespace parkMonitor.server.CoreThread
 {
     class QueuingThread : IEquipments
@@ -15,42 +17,52 @@ namespace parkMonitor.server.CoreThread
         Queue<Command> StoreCmdQueue = new Queue<Command>();
         Queue<Command> ValidStoreCmdQueue = new Queue<Command>();
         Queue<Command> FetchCmdQueue = new Queue<Command>();
-        Queue<Command> ExecutableCmdQueue = new Queue<Command>();
+        BlockingQueue ExecutableCmdQueue = new BlockingQueue();
         int fetchStoreRatio;
         bool isClosing = false;
         public IEquipments webHandle = null;
         public IEquipments numMachineHandle = null;
         NumberMachineNode license;
+        MessageUTF8 webMsg;
         Command executableCmd;
 
         public QueuingThread()
         {
-            executableCmd = new Command();
             try
             {
-                fetchStoreRatio = 3;
+                fetchStoreRatio = Int32.Parse(ConfigurationManager.AppSettings.Get("fetch_store_ratio"));
             }
             catch (Exception) { fetchStoreRatio = 3; Console.WriteLine("未找到停取车比例参数"); }
         }
 
-        private void Run()
+        private void ReceiveFromWebThread()
         {
             while (!isClosing)
             {
                 Command cmd = null;
                 if (webHandle != null)
                 {
-                    cmd = (Command)((Command)webHandle.GetMessage()).Clone();
-                    ((Command)webHandle.GetMessage()).LicenseNum = "";
+                    webMsg = (MessageUTF8)((MessageUTF8)webHandle.GetMessage()).Clone();
+                }
+                //get useful data from webMsg and assign it to output data structure
+                if (webMsg != null)
+                {
+                    cmd = new Command();
+                    cmd.commandType = webMsg.cmd;
+                    cmd.LicenseNum = webMsg.context;
+                    cmd.userID = webMsg.sender;
+                    cmd.garageID = webMsg.garageID;
+                    cmd.TimeRecord = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+                    webMsg = null;
                 }
                 //input user command
                 if (cmd != null)
                 {
-                    if (cmd.command.Equals(EnumCommand.Fetch))
+                    if (cmd.commandType.Equals('f'))
                     {
                         FetchCmdQueue.Enqueue((Command)cmd.Clone());
                     }
-                    else if (cmd.command.Equals(EnumCommand.Store))
+                    else if (cmd.commandType.Equals('s'))
                     {
                         StoreCmdQueue.Enqueue((Command)cmd.Clone());
                     }
@@ -59,11 +71,22 @@ namespace parkMonitor.server.CoreThread
                         Console.WriteLine("invalid user command.");
                     }
                 }
+                Thread.Sleep(50);
+            }
+        }
+
+        private void Run()
+        {
+            while (!isClosing)
+            {
+                Command cmd = null;
+                //接收号牌消息
                 //update license when it has been used
                 if (numMachineHandle != null && (license == null || license.ip == ""))
                 {
                     license = ((NumberMachineMessage)numMachineHandle.GetMessage()).aModel;
                 }
+                //队列业务逻辑
                 //match license number
                 for (int i = 0; i < StoreCmdQueue.Count; i++)
                 {
@@ -91,24 +114,14 @@ namespace parkMonitor.server.CoreThread
                     cmd = ValidStoreCmdQueue.Dequeue();
                     ExecutableCmdQueue.Enqueue((Command)cmd.Clone());
                 }
-
-                Thread.Sleep(1000);
+                Thread.Sleep(100);
             }
         }
 
         //公有方法
-        //please reset the licenseNum to "" after using
         public AbstractMessage GetMessage()
         {
-            if (executableCmd.LicenseNum == "" && ExecutableCmdQueue.Count != 0)
-            {
-                executableCmd = ExecutableCmdQueue.Dequeue();
-                return executableCmd;
-            }
-            else
-            {
-                return null;
-            }
+            return (Command)ExecutableCmdQueue.Dequeue();
         }
 
         public void SetMessage(AbstractMessage message)
@@ -118,7 +131,14 @@ namespace parkMonitor.server.CoreThread
 
         public void Start()
         {
-            Task.Factory.StartNew(()=> {
+            license = null;
+            webMsg = null;
+            Task.Factory.StartNew(() =>
+            {
+                ReceiveFromWebThread();
+            });
+            Task.Factory.StartNew(() =>
+            {
                 Run();
             });
         }

+ 35 - 0
Queuing/tools/BlockingQueue.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace parkMonitor.tools
+{
+    public class BlockingQueue
+    {
+        private BlockingCollection<object> bQueue = new BlockingCollection<object>(new ConcurrentQueue<object>());
+        public void Enqueue(object message)
+        {
+            bQueue.Add(message);
+        }
+        public object Dequeue()
+        {
+            //if(count() != 0)
+            //{
+                return bQueue.Take();
+            //}
+            //else
+            //{
+            //    return null;
+            //} 
+        }
+
+        public int count()
+        {
+
+            return bQueue.Count();
+        }
+    }
+}

+ 41 - 0
Queuing/tools/JsonByByteToObjectTools.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using parkMonitor.entity;
+
+
+//using System.Runtime.Serialization.Formatters.Binary;
+
+namespace parkMonitor.Tools
+{
+    public class JsonByByteToObjectTools
+    {
+        public static byte[] ObjToJsonByte(AbstractMessage message)
+        {
+            string objstr = JsonConvert.SerializeObject(message);
+            byte[] buffer = Encoding.UTF8.GetBytes(objstr);
+            return buffer;
+        }
+
+        public static AbstractMessage JsonByteToObj<AbstractMessage>(byte[] bstr) where AbstractMessage : class
+        {
+            int count = 0;
+            for (int i = 0; i < bstr.Length; i++)
+            {
+                if (bstr[i] == 0)
+                {
+                    count = i;
+                    break;
+                }
+            }
+            string str = new UTF8Encoding().GetString(bstr);
+
+            AbstractMessage msg = JsonConvert.DeserializeObject<AbstractMessage>(str);
+
+            return msg;
+        }
+    }
+}

+ 2 - 0
parkMonitor/App.config

@@ -34,6 +34,8 @@
     <add key="laser2_status_address" value=""/>
     <!--停取车比例-->
     <add key="fetch_store_ratio" value="3"/>
+    <!--Web ip配置-->
+    <add key="WebConfig" value="127.0.0.1:9000"/>
   </appSettings>
   <system.web>
     <membership defaultProvider="ClientAuthenticationMembershipProvider">

+ 1 - 1
parkMonitor/parkMonitor.csproj

@@ -143,7 +143,7 @@
     <Compile Include="server\monitorServer\MonitorServer.cs" />
     <Compile Include="server\monitorServer\PLCParamCtl.cs" />
     <Compile Include="server\uiLogServer\UILogServer.cs" />
-    <Compile Include="server\WebThread\BlockingQueue.cs" />
+    <Compile Include="tools\BlockingQueue.cs" />
     <Compile Include="server\WebThread\CentralForWebSocketServer.cs" />
     <Compile Include="server\WebThread\LazySingleton.cs" />
     <Compile Include="server\WebThread\MultiSocketThread.cs" />

+ 23 - 17
parkMonitor/server/CoreThread/QueuingThread.cs

@@ -8,7 +8,9 @@ using parkMonitor.entity;
 using parkMonitor.model;
 using parkMonitor.server;
 using System.Configuration;
+using parkMonitor.tools;
 
+/*  需要utf8+numNode, 阻塞队列   */
 namespace parkMonitor.server.CoreThread
 {
     class QueuingThread : IEquipments
@@ -16,19 +18,17 @@ namespace parkMonitor.server.CoreThread
         Queue<Command> StoreCmdQueue = new Queue<Command>();
         Queue<Command> ValidStoreCmdQueue = new Queue<Command>();
         Queue<Command> FetchCmdQueue = new Queue<Command>();
-        Queue<Command> ExecutableCmdQueue = new Queue<Command>();
+        BlockingQueue ExecutableCmdQueue = new BlockingQueue();
         int fetchStoreRatio;
         bool isClosing = false;
         IEquipments webHandle = null;
         IEquipments numMachineHandle = null;
         NumberMachineNode license;
-        Command executableCmd;
 
         public QueuingThread()
         {
             webHandle = EquipmentSimpleFactory.ins.FindEquipment("Web");
             numMachineHandle = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.NumMachine);
-            executableCmd = new Command();
             try
             {
                 fetchStoreRatio = Int32.Parse(ConfigurationManager.AppSettings.Get("fetch_store_ratio"));
@@ -36,15 +36,15 @@ namespace parkMonitor.server.CoreThread
             catch (Exception) { fetchStoreRatio = 3; Console.WriteLine("未找到停取车比例参数"); }
         }
 
-        private void Run()
+        private void ReceiveFromWebThread()
         {
             while (!isClosing)
             {
                 Command cmd = null;
+                //接收web消息
                 if (webHandle != null)
                 {
                     cmd = (Command)((Command)webHandle.GetMessage()).Clone();
-                    ((Command)webHandle.GetMessage()).LicenseNum = "";
                 }
                 //input user command
                 if (cmd != null)
@@ -62,11 +62,21 @@ namespace parkMonitor.server.CoreThread
                         Console.WriteLine("invalid user command.");
                     }
                 }
+            }
+        }
+
+        private void Run()
+        {
+            while (!isClosing)
+            {
+                Command cmd = null;
+                //接收号牌消息
                 //update license when it has been used
-                if (numMachineHandle != null &&  (license == null || license.ip == ""))
+                if (numMachineHandle != null && (license == null || license.ip == ""))
                 {
                     license = ((NumberMachineMessage)numMachineHandle.GetMessage()).aModel;
                 }
+                //队列业务逻辑
                 //match license number
                 for (int i = 0; i < StoreCmdQueue.Count; i++)
                 {
@@ -94,7 +104,6 @@ namespace parkMonitor.server.CoreThread
                     cmd = ValidStoreCmdQueue.Dequeue();
                     ExecutableCmdQueue.Enqueue((Command)cmd.Clone());
                 }
-
                 Thread.Sleep(1000);
             }
         }
@@ -103,15 +112,7 @@ namespace parkMonitor.server.CoreThread
         //please reset the licenseNum to "" after using
         public AbstractMessage GetMessage()
         {
-            if (executableCmd.LicenseNum == "" && ExecutableCmdQueue.Count != 0)
-            {
-                executableCmd = ExecutableCmdQueue.Dequeue();
-                return executableCmd;
-            }
-            else
-            {
-                return null;
-            }
+            return (AbstractMessage)ExecutableCmdQueue.Dequeue();
         }
 
         public void SetMessage(AbstractMessage message)
@@ -121,7 +122,12 @@ namespace parkMonitor.server.CoreThread
 
         public void Start()
         {
-            Task.Factory.StartNew(()=> {
+            Task.Factory.StartNew(() =>
+            {
+                ReceiveFromWebThread();
+            });
+            Task.Factory.StartNew(() =>
+            {
                 Run();
             });
         }

+ 3 - 4
parkMonitor/server/WebThread/CentralForWebSocketServer.cs

@@ -8,8 +8,9 @@ using System.Configuration;
 using System.Net.Sockets;
 using System.Net;
 using System.Threading;
+using parkMonitor.tools;
 
-namespace parkMonitor.server.CentralForWebSocketServer
+namespace parkMonitor.server.WebThread
 {
     public class CentralForWeb : IEquipments
     {
@@ -18,7 +19,7 @@ namespace parkMonitor.server.CentralForWebSocketServer
 
         public AbstractMessage GetMessage()
         {
-            return (AbstractMessage)blockingQueue.DeQueue();
+            return (AbstractMessage)blockingQueue.Dequeue();
         }
         public void SetMessage(AbstractMessage message)
         {
@@ -65,8 +66,6 @@ namespace parkMonitor.server.CentralForWebSocketServer
             });
             thread.IsBackground = true;
             thread.Start();
-
-
         }
         public void Stop()
         {

+ 1 - 1
parkMonitor/server/WebThread/LazySingleton.cs

@@ -6,7 +6,7 @@ using System.Net.Sockets;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace parkMonitor.server.CentralForWebSocketServer
+namespace parkMonitor.server.WebThread
 {
     class LazySingleton
     {

+ 2 - 2
parkMonitor/server/WebThread/MultiSocketThread.cs

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
 using parkMonitor.Tools;
 using parkMonitor.entity;
 
-namespace parkMonitor.server.CentralForWebSocketServer
+namespace parkMonitor.server.WebThread
 {
     public class MultiSocketThread
     {
@@ -59,7 +59,7 @@ namespace parkMonitor.server.CentralForWebSocketServer
 
             MessageUTF8 msg = (MessageUTF8)ReceiverMessage();
 
-            CentralForWeb.blockingQueue.EnQueue(msg);
+            CentralForWeb.blockingQueue.Enqueue(msg);
         }
         public void Close()
         {

+ 4 - 3
parkMonitor/server/WebThread/BlockingQueue.cs

@@ -5,15 +5,16 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace parkMonitor.server.CentralForWebSocketServer{
+namespace parkMonitor.tools
+{
     public class BlockingQueue
     {
         private BlockingCollection<object> bQueue = new BlockingCollection<object>(new ConcurrentQueue<object>());
-        public void EnQueue(object message)
+        public void Enqueue(object message)
         {
             bQueue.Add(message);
         }
-        public object DeQueue()
+        public object Dequeue()
         {
             return bQueue.Take();
         }

+ 7 - 0
模拟输入数据.txt

@@ -0,0 +1,7 @@
+{"cmd":"s","context":"´¨AT0H69","sender":"14","receiver":"","garageID":1}
+
+{"cmd":"s","context":"ÔÁCKC236","sender":"14","receiver":"","garageID":1}
+
+{"cmd":"s","context":"¾©PBS362","sender":"14","receiver":"","garageID":1}
+
+{"cmd":"s","context":"¾©PH3X00","sender":"14","receiver":"","garageID":1}