public void checkQueue(double time) { List <int> ptr = new List <int>(); //Загружаем задачи из плана for (int i = 0; i < queue.Count; i++) { Task t = queue.ElementAt(i); if (time > t.getTimeInit()) { listQ.Enqueue(t); ptr.Add(t.getId()); } } foreach (int p in ptr) { Task t = null; foreach (Task t1 in queue) { if (t1.getId() == p) { t = t1; break; } } queue.Remove(t); } //Удаляем просроченные задачи ptr = new List <int>(); for (int i = 0; i < listQ.Count; i++) { Task t = listQ.ElementAt(i); if (time > (t.getTimeInit() + t.getDeadline())) { ptr.Add(t.getId()); } } foreach (int p in ptr) { Task t = null; foreach (Task t1 in listQ) { if (t1.getId() == p) { t = t1; break; } } t.setEnd(time); ready.Enqueue(t); listQ.Remove(t); } }
public void run() { number = new List <int>(); free = 0; busy = 0; double time = 0; while ((listQ.Count != 0) || (queue.Count != 0)) { checkQueue(time); cluster.voting(); if ((listQ.Count > 0) || (cluster.freeCluster(time))) { number.Add(listQ.Count); double nextTime = double.MaxValue; while ((listQ.Count > 0) && (cluster.freeCluster(time))) { double T = 0; double score = double.MaxValue; int ptr = -1; for (int i = 0; i < listQ.Count; i++) { if (getScore(listQ.ElementAt(i), time) < score) { score = getScore(listQ.ElementAt(i), time); ptr = i; } } T = listQ.ElementAt(ptr).getTime(); listQ.ElementAt(ptr).execute(time); Task t = listQ.ElementAt(ptr); listQ.Remove(t); //В список решенных ready.Enqueue(t); //time += T; //busy += T; if (T < nextTime) { nextTime = T; } } time += nextTime; } else { double initTime = double.MaxValue; int ptr = 0; for (int i = 0; i < queue.Count; i++) { if (queue.ElementAt(i).getTimeInit() < initTime) { ptr = i; initTime = queue.ElementAt(i).getTimeInit(); } } if (initTime == double.MaxValue) { time = double.MaxValue; } else { free += (initTime + 0.00000000000001) - time; time = initTime + 0.00000000000001; } } } }