public void Enqueue(string element, QueuePriorities priority = QueuePriorities.Medium)
 {
     lock (syncRoot)
     {
         if (m_count > MaxCapacity)
         {
             ClearQueue();
         }
         m_count += 1;
     }
         queue.Enqueue(element);
 }
 public void Enqueue(string element, QueuePriorities priority = QueuePriorities.Medium)
 {
     lock (syncRoot)
     {
         if (m_count > MaxCapacity)
         {
             ClearQueue();
         }
         m_count += 1;
     }
     queue.Enqueue(element);
 }
        public void Enqueue(string value, QueuePriorities priority = QueuePriorities.Medium)
        {
            if (value == null)
            {
                throw new ArgumentNullException();
            }

            lock (WriteLock)
            {
                if (Count + 1 > MaxCapacity) {
                    ClearQueue();
                }
                lastElement += 1;
                queue[lastElement] = new Node(priority, value);
                BubbleUp(lastElement);
            }
        }
        public void Enqueue(string value, QueuePriorities priority = QueuePriorities.Medium)
        {
            if (value == null)
            {
                throw new ArgumentNullException();
            }

            lock (WriteLock)
            {
                if (Count + 1 > MaxCapacity)
                {
                    ClearQueue();
                }
                lastElement       += 1;
                queue[lastElement] = new Node(priority, value);
                BubbleUp(lastElement);
            }
        }
예제 #5
0
        /// <summary>
        /// Загрузить состояние: билеты в очереди, текущие обрабаываемые билеты попадают в приоритетеную очередь кассира и будут обработанны касииром снова
        /// </summary>
        public void LoadStates()
        {
            try
            {
                if (File.Exists("States.dat"))
                {
                    var formatter = new BinaryFormatter();
                    using (var fs = new FileStream("States.dat", FileMode.Open))
                    {
                        var model = (QueuePrioritysModelSerializable)formatter.Deserialize(fs);

                        //восстановить элементы очереди
                        foreach (var newQueue in model.Queues)
                        {
                            var queue = QueuePriorities.FirstOrDefault(q => q.Name == newQueue.Name);
                            if (queue != null)
                            {
                                queue.SetQueueItems          = newQueue.Queue;
                                queue.SetCurrentTicketNumber = newQueue.CurrentTicketNumber;
                            }
                        }

                        //восстановить текущие обрабатываемые билеты кассирами
                        foreach (var newCashier in model.Cashiers)
                        {
                            if (newCashier.CurrenTicketItem == null)
                            {
                                continue;
                            }

                            var cashier = DeviceCashiers.FirstOrDefault(d => d.Cashier.Id == newCashier.Id);
                            cashier?.Cashier.AddRedirectedTicket(newCashier.CurrenTicketItem);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
 public void InsertIntoQueue(IQueue queue, QueuePriorities priority)
 {
     queue.Enqueue(VALID_ELEMENT_MOVEMENT, priority);
 }
 public Node(QueuePriorities priority, string value)
 {
     Priority = priority;
     Value    = value;
 }
예제 #8
0
 public void InsertIntoQueue(IQueue queue, QueuePriorities priority)
 {
     queue.Enqueue(VALID_ELEMENT_MOVEMENT, priority);
 }
예제 #9
0
        public void LoadSetting()
        {
            //ЗАГРУЗКА НАСТРОЕК----------------------------------------------------------------
            XmlListenerSettings       xmlListener;
            IList <XmlSerialSettings> xmlSerials;
            List <XmlCashierSettings> xmlCashier;
            List <XmlQueuesSettings>  xmlQueues;

            try
            {
                var xmlFile = XmlWorker.LoadXmlFile("Settings", "Setting.xml"); //все настройки в одном файле
                if (xmlFile == null)
                {
                    return;
                }

                xmlListener = XmlListenerSettings.LoadXmlSetting(xmlFile);
                xmlSerials  = XmlSerialSettings.LoadXmlSetting(xmlFile).ToList();
                xmlCashier  = XmlCashierSettings.LoadXmlSetting(xmlFile);
                xmlQueues   = XmlQueuesSettings.LoadXmlSetting(xmlFile);
            }
            catch (FileNotFoundException ex)
            {
                ErrorString = ex.ToString();
                return;
            }
            catch (Exception ex)
            {
                ErrorString = "ОШИБКА в узлах дерева XML файла настроек:  " + ex;
                return;
            }

            //РАЗРЕШИТЬ ЛОГГИРОВАНИЕ-----------------------------------------------------------
            Log.EnableLogging(true);

            //СОЗДАНИЕ ОЧЕРЕДИ-----------------------------------------------------------------------
            foreach (var xmlQueue in xmlQueues)
            {
                var queue = new QueuePriority(xmlQueue.Name, xmlQueue.Prefixes);
                QueuePriorities.Add(queue);
            }


            //СОЗДАНИЕ СЛУШАТЕЛЯ ДЛЯ ТЕРМИНАЛОВ-------------------------------------------------------
            Listener         = new ListenerTcpIp(xmlListener);
            ProviderTerminal = new Server2TerminalExchangeDataProvider(isSynchronized: true);
            ProviderTerminal.PropertyChanged += (o, e) =>
            {
                var provider = o as Server2TerminalExchangeDataProvider;
                if (provider != null)
                {
                    if (e.PropertyName == "InputData")
                    {
                        try
                        {
                            provider.OutputData = provider.OutputData ?? new TerminalOutData();

                            //Найдем очередь к которой обращен запрос
                            var prefixQueue = provider.InputData.PrefixQueue;
                            var nameQueue   = provider.InputData.NameQueue;
                            var queue       = QueuePriorities.FirstOrDefault(q => string.Equals(q.Name, nameQueue, StringComparison.InvariantCultureIgnoreCase));

                            if (queue == null)
                            {
                                return;
                            }

                            switch (provider.InputData.Action)
                            {
                            //ИНФОРМАЦИЯ ОБ ОЧЕРЕДИ
                            case TerminalAction.Info:
                                provider.OutputData.PrefixQueue   = provider.InputData.PrefixQueue;
                                provider.OutputData.CountElement  = (ushort)queue.GetInseartPlace(prefixQueue);
                                provider.OutputData.NumberElement = (ushort)(queue.GetCurrentTicketNumber + 1);
                                provider.OutputData.AddedTime     = DateTime.Now;
                                break;

                            //ДОБАВИТЬ БИЛЕТ В ОЧЕРЕДЬ
                            case TerminalAction.Add:
                                var ticket = queue.CreateTicket(prefixQueue);

                                provider.OutputData.PrefixQueue   = provider.InputData.PrefixQueue;
                                provider.OutputData.CountElement  = ticket.CountElement;
                                provider.OutputData.NumberElement = (ushort)ticket.NumberElement;
                                provider.OutputData.AddedTime     = ticket.AddedTime;
                                queue.Enqueue(ticket);
                                var logMessage = $"ДОБАВИТЬ БИЛЕТ В ОЧЕРЕДЬ (команда от терминала): {ticket.ToString()}   ";
                                _logQueueInput.Info(logMessage);
                                break;
                            }
                        }
                        catch (Exception ex)
                        {
                            _logQueueInput.Error($"Server2TerminalExchangeDataProvider:   {ex.ToString()}");
                        }
                    }
                }
            };

            //DEBUG------ИНИЦИАЛИЗАЦИЯ ОЧЕРЕДИ---------------------
            //Обязательно коментировать  _model.LoadStates(); иначе состояние очереди затрется
            //var queueTemp = QueuePriorities.FirstOrDefault(q => string.Equals(q.Name, "Main", StringComparison.InvariantCultureIgnoreCase));
            //var queueAdmin = QueuePriorities.FirstOrDefault(q => string.Equals(q.Name, "Admin", StringComparison.InvariantCultureIgnoreCase));
            //for (int i = 0; i < 200; i++)
            //{
            //    var ticketAdmin = queueTemp.CreateTicket("А");
            //    queueAdmin.Enqueue(ticketAdmin);

            //    var ticket = queueTemp.CreateTicket("К");
            //    queueTemp.Enqueue(ticket);

            //    ticket = queueTemp.CreateTicket("К");
            //    queueTemp.Enqueue(ticket);

            //    ticket = queueTemp.CreateTicket("Г");
            //    queueTemp.Enqueue(ticket);

            //    ticket = queueTemp.CreateTicket("И");
            //    queueTemp.Enqueue(ticket);

            //    ticket = queueTemp.CreateTicket("С");
            //    queueTemp.Enqueue(ticket);
            //}
            //DEBUG----------------------------------------------


            //СОЗДАНИЕ КАССИРОВ------------------------------------------------------------------------------------------------
            foreach (var xmlCash in xmlCashier)
            {
                var queue = QueuePriorities.FirstOrDefault(q => q.Name == xmlCash.NameQueue);
                if (queue != null)
                {
                    var logName = "Server.CashierInfo_" + xmlCash.Port;
                    var casher  = new Сashier(xmlCash.Id, xmlCash.Prefixs, queue, xmlCash.MaxCountTryHanding, logName);
                    DeviceCashiers.Add(new DeviceCashier(xmlCash.AddressDevice, casher, xmlCash.Port));
                }
            }
            AdminCasher = DeviceCashiers.FirstOrDefault(d => d.Cashier.Prefixes.Contains("А"));


            //СОЗДАНИЕ ПОСЛЕД. ПОРТА ДЛЯ ОПРОСА КАССИРОВ-----------------------------------------------------------------------
            var cashersGroup = DeviceCashiers.GroupBy(d => d.Port).ToDictionary(group => group.Key, group => group.ToList());  //принадлежность кассира к порту

            foreach (var xmlSerial in xmlSerials)
            {
                var logName     = "Server.CashierInfo_" + xmlSerial.Port;
                var sp          = new MasterSerialPort(xmlSerial, logName);
                var cashiers    = cashersGroup[xmlSerial.Port];
                var cashierExch = new CashierExchangeService(cashiers, AdminCasher, xmlSerial.TimeRespoune, logName);
                sp.AddFunc(cashierExch.ExchangeService);
                //sp.PropertyChanged += (o, e) =>
                // {
                //     var port = o as MasterSerialPort;
                //     if (port != null)
                //     {
                //         if (e.PropertyName == "StatusString")
                //         {
                //             ErrorString = port.StatusString;                     //TODO: РАЗДЕЛЯЕМЫЙ РЕСУРС возможно нужна блокировка
                //        }
                //     }
                // };
                MasterSerialPorts.Add(sp);
                CashierExchangeServices.Add(cashierExch);
            }
        }
 public Node(QueuePriorities priority, string value)
 {
     Priority = priority;
     Value = value;
 }