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); } }
/// <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; }
public void InsertIntoQueue(IQueue queue, QueuePriorities priority) { queue.Enqueue(VALID_ELEMENT_MOVEMENT, priority); }
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; }