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();
                }
            }
        }