private void AutoGenerateTimer_Tick(object sender, EventArgs e) //тик таймера автогенерации { int sttmp = rnd.Next((int)((GenerateStageRangeMax.Value - GenerateStageRangeMin.Value) + GenerateStageRangeMin.Value)); // получаем диапазон количества стейджей и задаем их рандомное значение if (sttmp % 2 == 0) { sttmp = sttmp + 1; } //делаем количество стейджей нечетным ProcessObject temp = new ProcessObject(sttmp); //создаем темп объект процесса с указаным выше количеством стейджей for (int i = 0; i < temp.StageCount; i++) //рандомно заполняем их. (для четного и нечетного правила разные) { if (i % 2 == 0) { temp.StageQuue[i] = rnd.Next((int)((GenerateStageTimeRangeMax.Value - GenerateStageTimeRangeMin.Value) + GenerateStageTimeRangeMin.Value) * 1000); } else { temp.StageQuue[i] = rnd.Next((int)((GenerateStageTimeRangeMax.Value - GenerateStageTimeRangeMin.Value) + GenerateStageTimeRangeMin.Value)); } } temp.ProcessID = ID; //записываем ид temp.ProcessName = "test" + ID.ToString(); //записываем имя ID++; //инкримируем ид temp.ProcessPriority = rnd.Next(1000); //задаем приоритет QueueProcess.Add(temp); //добавляем в очередь готовых WriteToLog(temp, "Сгенерирована задача"); //записываем в лог if (ExecutedProcessName.Text == "") //проверяем наличие выполняемого процесса { ToExecutedTask(); ExecutedTimer.Start(); // старт таймера выполнения процесса } RefreshReadyQuueViewFunc(); //перерисовка очереди готовых задач }
private void WriteToLog(ProcessObject ProcToLog, string action) // запись в лог { swel.WriteLine(ProcToLog.ProcessID.ToString() + " " + ProcToLog.ProcessName + " " + action + " " + DateTime.Now.ToString()); //запись в файл ListViewItem tmp = new ListViewItem(); //создаем строку для добавления tmp.Text = ProcToLog.ProcessID.ToString(); tmp.SubItems.Add(ProcToLog.ProcessName); tmp.SubItems.Add(action); tmp.SubItems.Add(DateTime.Now.ToString()); LogView.Items.Insert(0, tmp);//вставляем эту строку в list view лога }
private void ToExecutedTask() // работа с выполняемым процессом { ProcessObject TempProcessObject = new ProcessObject(); TempProcessObject = GetProcessFromQueue(); //берем процесс с наибольшим приорететом ExecutedTimer.Interval = (int)(TempProcessObject.StageQuue[TempProcessObject.StageNow] * k); // назначение времени, необходимого для выполнения процесса ExecutedProcessName.Text = TempProcessObject.ProcessName; // запись информации о процессе в текстбоксы выполнения ExecutedProcessId.Text = Convert.ToString(TempProcessObject.ProcessID); ExecutedProcessTime.Text = TempProcessObject.StageQuue[TempProcessObject.StageNow].ToString(); TempProcessObject.StageNow++; //увеличиваем стейдж WriteToLog(SavedExucutedProcess, "Задача отправлена на выполнение"); //запись в лог }
private ProcessObject GetProcessFromQueue() //функция поиска процесса по приоретету { int MaxPrior = -1; ProcessObject TempProcessObject; for (int i = 0; i < QueueProcess.Count; i++) // поиск максимального приоретета в листе { if (MaxPrior < QueueProcess[i].ProcessPriority) { MaxPrior = QueueProcess[i].ProcessPriority; } } TempProcessObject = QueueProcess.Find(x => x.ProcessPriority == MaxPrior); //нахождение объекта процесса в листе по значению приоретета QueueProcess.Remove(TempProcessObject); //удаление его из учереди SavedExucutedProcess = TempProcessObject; // запись в объект исполняемого процесса RefreshReadyQuueViewFunc(); //перерисовка очереди готовых return(TempProcessObject); //возвращаем найденный процесс }
private void RefreshIDInfo_Tick_1(object sender, EventArgs e)//таймер вывод информации о процессе { if (ID > 0) { IdInfo.Maximum = ID - 1; } //установление выборки ид else { IdInfo.Maximum = ID; } if (IdInfo.Text.Length > 0 && ID > 0 && IdInfo.Value < ID) //условия проверки ид { ProcessObject tmp = new ProcessObject(); //темп объект bool find = false; //булевая переменная для оптимизации string wherefind = ""; //строка для передачи функции int GetIDInfo = Convert.ToInt32(IdInfo.Text); //ид for (int i = 0; i < QueueProcess.Count; i++) //проверка очереди готовых { if (QueueProcess[i].ProcessID == GetIDInfo) { tmp = QueueProcess[i]; wherefind = "prepared"; find = true; break; } } if (find != true)//проверка в выполнении { if (SavedExucutedProcess.ProcessID == GetIDInfo) { tmp = SavedExucutedProcess; find = true; wherefind = "executed"; } } if (find != true)//проверка в ожидании { for (int i = 0; i < WaitingProcess.Count; i++) { tmp = WaitingProcess[i]; find = true; wherefind = "waiting"; break; } } if (find != true)//поиск в выполненых процессах { for (int i = 0; i < ExecutedProcess.Count; i++) { tmp = ExecutedProcess[i]; find = true; wherefind = "ready"; break; } } if (find != true)//ошибка ? { MessageBox.Show("Какая-то ошибка"); } else { ProgressView.Rows.Clear(); //очишаем текущий бар ProgressView.RowCount = 1; switch (wherefind) //выбираем в какой очереди найдено, и передаем соот-е параметры на функцию отрисовки { case "waiting": PaintIDInfo(tmp.StageNow, tmp.StageCount); break; case "prepared": PaintIDInfo(tmp.StageNow, tmp.StageCount); break; case "ready": ProgressView.ColumnCount = 1; ProgressView[0, 0].Value = "Задача выполнена"; break; case "executed": PaintIDInfo(tmp.StageNow - 1, tmp.StageCount); break; } ProgressView.AutoResizeColumns(); } } else { if (ID == 0) { ProgressView.Rows.Clear(); ProgressView.ColumnCount = 1; ProgressView.RowCount = 1; ProgressView[0, 0].Value = "Запустите генирацию процессов"; ProgressView.AutoResizeColumns(); } else { ProgressView.Rows.Clear(); ProgressView.ColumnCount = 1; ProgressView.RowCount = 1; ProgressView[0, 0].Value = "Введите ID"; ProgressView.AutoResizeColumns(); } } }