Ejemplo n.º 1
0
 public Operator(int _work_time, operator_state _state)
 {
     total_work_time = 0;
     work_time = _work_time;
     state = _state;
     cl = new Client();
     cl = null;
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
 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;
 }
Ejemplo n.º 5
0
 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;
 }
Ejemplo n.º 6
0
 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; //общее время работы
 }
Ejemplo n.º 7
0
 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()); //иначе - из другой
         }
     }
 }
Ejemplo n.º 8
0
 //создание клиента автоматически
 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;
 }
Ejemplo n.º 9
0
 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++; //отказано в обслуживании (все очереди переполнены)
     }
 }
Ejemplo n.º 10
0
 //создание клиента вручную
 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);
 }
Ejemplo n.º 11
0
 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;
 }