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 ExecutedTimer_Tick(object sender, EventArgs e)                   //тик таймера выполнения
 {
     if (StartExTimerFromWaitingQu == false)                                   //проверка на запуск таймера из очереди ожидания
     {
         if (SavedExucutedProcess.StageNow != SavedExucutedProcess.StageCount) //проверка на полное выполнение процесса
         {
             WaitingProcess.Add(SavedExucutedProcess);                         //отравление в очередь ожидания
             if (WaitingProcess.Count == 1 && WaitingQuueTimer.Enabled == false)
             {
                 WaitingQuueTimer.Start();
             }                                                           //проверка на необходимость запуска таймера очереди ожидания
             RefreshWaitingQuueViewFunc();                               //перерисовка очереди ожидания
             WriteToLog(SavedExucutedProcess, "Выполнена часть задачи"); //запись в лог
         }
         else
         {
             WriteToLog(SavedExucutedProcess, "Задача выполнена"); ExecutedProcess.Add(SavedExucutedProcess);
         }                            //полное выполнение процесса
         if (QueueProcess.Count != 0) //проверка очереди готовых
         {
             ToExecutedTask();        //передаем процесс на выполнение
         }
         else
         {
             ExecutedTimer.Stop(); ExecutedProcessId.Text = ""; ExecutedProcessName.Text = ""; ExecutedProcessTime.Text = "";
         }                                                                                                                        //нечего не выполняется
     }
     else
     {
         ToExecutedTask();                  //передаем процесс на выполнение
         StartExTimerFromWaitingQu = false; //
     }
 }
 private void WaitingQuueTimer_Tick(object sender, EventArgs e) // таймер очереди ожидания
 {
     if (WaitingProcess.Count != 0)                             //процерка на наличие процессов в очереди ожидания
     {
         bool refr = false;                                     //переменная указывающая на необходимость перирисовки
         for (int i = 0; i < WaitingProcess.Count; i++)
         {
             if (WaitingProcess[i].WaitingTime++ >= WaitingProcess[i].StageQuue[WaitingProcess[i].StageNow]) //проверка на время нахождения в очереди готовых
             {
                 WaitingProcess[i].StageNow++;                                                               //меняем стейдж
                 WaitingProcess[i].WaitingTime = 0;                                                          //обнуляем время ожидания
                 QueueProcess.Add(WaitingProcess[i]);                                                        //отравление в очередь готовых
                 WriteToLog(WaitingProcess[i], "Отправлен в очередь готовых из ожидания");                   //запись в лог
                 WaitingProcess.Remove(WaitingProcess[i]);                                                   //удаление из очереди ожидания
                 if ((QueueProcess.Count == 1) && (ExecutedTimer.Enabled == false))
                 {
                     StartExTimerFromWaitingQu = true; ExecutedTimer.Interval = 1; ExecutedTimer.Start();
                 }            // проверка на наличие процессов в очереди готовности и запущен ли таймер выполнения
                 refr = true; //включаем флаг на перерисовку
             }
             else
             {
                 WaitingProcess[i].WaitingTime++;//инкримируем время ожидания процесса
             }
         }
         if (refr == true)                 //проверка на необходимость перерисовки
         {
             RefreshWaitingQuueViewFunc(); //перерисовка очереди ожидания
             RefreshReadyQuueViewFunc();   //перерисовка очереди исполнения
         }
     }
     else
     {
         WaitingQuueTimer.Stop();
     }                                //остановка таймера ожидание, если очередь пуста
 }