public Operator(int _work_time, operator_state _state) { total_work_time = 0; work_time = _work_time; state = _state; cl = new Client(); cl = null; }
public Client remove_client() //обслуженный клиент { Client served_cl = new Client(); served_cl = cl; served_cl.state = client_state.Finalized; //обслуживание завершено cl = null; state = operator_state.Vacant; return served_cl; }
public Client(Client _other) { ID = _other.ID; req_max_count = _other.req_max_count; req_count = _other.req_count; req_done = _other.req_done; for (int i = 0; i < req_count; i++) req[i] = _other.req[i]; state = _other.state; }
public bool add_client(Client new_cl) { if (state == operator_state.Occuped || new_cl == null) return false; cl = new_cl; cl.state = client_state.Started; //обслуживание начато client_id = cl.ID; set_work_time(cl); state = operator_state.Occuped; return true; }
public Client dequeue() { if (is_empty()) return null; Client deq_client = new Client(); deq_client = pool[head]; pool[head] = null; //снимаем с рассмотрения head = (head + 1) % max_count; //сдвинули голову (хвост остался на месте) - по аналогии с добавлением count--; //-1 элемент OnDecreaseRequestEvent(new OnAddReq(deq_client.ID.ToString())); return deq_client; }
private void set_work_time(Client _cl) //определяем время, необходимое на обработку клиента { work_time = 0; for (int i = 0; i < _cl.req_max_count; i++) { if (k_type == kassa_type.N37) //если касса 3-7, то исключаем операции обмена if (cl.get_request(i).operation != request_type.XCHG) { work_time += cl.get_request(i).service_time; cl.inc_req_done(); //увеличиваем число обработанных заявок } if (k_type == kassa_type.N12) //если 1-2, то исключаем все операции, кроме обмена if (cl.get_request(i).operation == request_type.XCHG) { work_time += cl.get_request(i).service_time; cl.inc_req_done(); //увеличиваем число обработанных заявок } } total_work_time += work_time; //общее время работы }
public void check_kassa() { bool flag; Client r = new Client(); for (int i = 0; i < 7; i++) { if (kasses[i].state == operator_state.NotReady) //касса отработала { //сначала убираем клиента if (!kasses[i].is_empty()) if (i >= 2) //если в кассах 3-7 есть клиенты с заявкими ХСНG, то переносим их в 1-ю очередь { r = kasses[i].remove_client(); //убираем клиента r.state = client_state.Checked; if (r.get_req_done() != r.req_max_count) //если у клиента еще остались заявки ХСНG { r.state = client_state.Queued; flag = clients[0].enqueue(r); //ставим его в очередь на 1-2 кассы } } else { r = kasses[i].remove_client(); //иначе просто убираем клиента r.state = client_state.Finalized; } if (i < 2) flag = kasses[i].add_client(clients[0].dequeue()); //если обменные кассы, то добавляем клиента из обменной очереди else flag = kasses[i].add_client(clients[1].dequeue()); //иначе - из другой } } }
//создание клиента автоматически private Client create_client() { int max; max = rnd.Next(2) + 2; Client cl = new Client(ID++, max); for (int i = 0; i < max; i++) cl.add_request(create_request()); set_random_creatime(); //время до следующего клиента return cl; }
public void into_queue(Client cl) { bool flag; int check = 0; //проверка на наличие заявок, отличных от типа XCHG all_clients++; //клиент +1 for (int i = 0; i < cl.req_max_count; i++) if (cl.get_request(i).operation != request_type.XCHG) check++; //определяем, в какую очередь поставить клиента if (check == 0) { cl.state = client_state.Queued; //клиент поставлен в очередь in_queue q = clients[0].enqueue; //вызов функции с использованием делегата flag = q(cl); //flag = clients[0].enqueue(cl); //обмен } else { cl.state = client_state.Queued; in_queue q = clients[1].enqueue; //вызов функции с использованием делегата flag = q(cl); //flag = clients[1].enqueue(cl); //прочее } if (!flag) { cl.state = client_state.Refused; //не поставлен refused_clients++; //отказано в обслуживании (все очереди переполнены) } }
//создание клиента вручную public void create_client(int _max, Request[] _rec) { Client cl = new Client(ID++, _max); for (int i = 0; i < _max; i++) { cl.add_request(_rec[i]); } into_queue(cl); }
public bool enqueue(Client new_client) { if (is_full()) return false; if (is_empty()) //по умолчанию, если очередь пуста { head = 0; tail = 0; pool[tail] = new_client; //хвост не сдвигаем } else { tail = (tail + 1) % max_count; //новое значение хвоста (голова - на прежнем месте) pool[tail] = new_client; //остаток от деления на MaxSize - верный способ избежать вылета за диапазон и 'зациклить' массив //т.е, в случае, если последний элемент занят, а место перед головой свободно, то хвост переместится туда } OnRaiseRequestEvent(new OnAddReq(new_client.ID.ToString())); //вызов события count++; return true; }