示例#1
0
 private void BtnStartExam_Click(object sender, EventArgs e)
 {
     try
     {
         if (tempMessage != null && !CheckAuth(tempMessage.CarSignal.Gps))
         {
             return;
         }
         if (btnStartExam.Text == "开始考试")
         {
             MapSpinner.Visibility = ViewStates.Invisible;
             btnStartExam.Text     = "结束考试";
             examProcess           = new ExamProcess();
             MapSpinner.Enabled    = false;
             tvMapInfo.Text        = "线路:" + MapName;
             InitExamItem();
             StartExam();
         }
         else
         {
             ExamFinishing();
         }
     }
     catch (Exception ex)
     {
         Logger.Error(ex, this.GetType().ToString());
     }
 }
示例#2
0
 //Определяет перемещать ли студента в следующую очередь
 private void NextQueueOrEnd(ExamProcess exam)
 {
     lock (students)
     {
         lock (studentsQueue)
         {
             if (exam.Student.SubjectToPassing.RemainingTime > 0)                        //Если еще осталось CPU burst
             {
                 if (exam.QueueLevel == queueLevel)                                      //Если выполняется все та же очередь
                 {
                     studentsQueue.ElementAtOrDefault(queueLevel + 1).Add(exam.Student); //Добавляем студента в след. очередь
                 }
                 else                                                                    //Если выполняется уже следующая
                 {
                     studentsQueue.ElementAtOrDefault(queueLevel).Add(exam.Student);     //Добавляем в нее студента
                 }
             }
             //Если текущая очередь пустая и эта очередь не последняя
             if (students.Count == 0 && studentsQueue.ElementAtOrDefault(queueLevel + 1) != null)
             {
                 students = studentsQueue[++queueLevel];                     //Переходим к следующей
             }
         }
     }
 }
示例#3
0
        /// <summary>
        /// Вывод занятых ресурсов.
        /// </summary>
        internal void LogTakenResources(ExamProcess exam, PlainType plainType, int queueLevel)
        {
            sb.Append($"{exam.Student.Status()} started | ");
            foreach (var eqName in exam.Student.SubjectToPassing.EquipmentNames)
            {
                sb.Append($"<{exam.Equipments.Where(e => e.Name == eqName).FirstOrDefault().Status()}> ");
            }

            sb.AppendLine($"<{exam.Teacher.Status()}>");
            Output();
        }
示例#4
0
        /// <summary>
        /// Запуск максимально возможного количества потоков
        /// </summary>
        /// <param name="students">Очередь студентов</param>
        protected void StartMaxThreads()
        {
            lock (students)
            {
                if (students.Where(s => s.SubjectToPassing.RemainingTime > 0).Any())
                {
                    while (students.Where(s => s.SubjectToPassing.RemainingTime > 0).Any() && CheckResources(HigherPriorityStudent()))
                    {
                        ExamProcess exam = new ExamProcess(ref students, teachers.Where(t => t.NumberOfStudents > 0).FirstOrDefault(), equipments, queueLevel);
                        Thread      t    = new Thread(StartPassExam);
                        threads.Add(t);
                        t.Start(exam);
                    }

                    if (threads.Where(t => t.ManagedThreadId != Thread.CurrentThread.ManagedThreadId).All(t => t.ThreadState == ThreadState.Stopped))
                    {
                        throw new Exception("Deadlock.");
                    }
                }
            }
        }
示例#5
0
        /// <summary>
        /// Вывод при освобождении ресурсов.
        /// </summary>
        internal void LogReleasedResources(ExamProcess exam, int threadId, PlainType plainType, int queueLevel = 0)
        {
            sb.Append(exam.Student.Status());

            if (exam.Student.SubjectToPassing.RemainingTime > 0)
            {
                sb.Append($" release | ");
            }
            else
            {
                sb.Append($" finish  | ");
            }

            foreach (var eqName in exam.Student.SubjectToPassing.EquipmentNames)
            {
                sb.Append($"<{exam.Equipments.Where(e => e.Name == eqName).FirstOrDefault().Status()}> ");
            }

            sb.AppendLine($"<{exam.Teacher.Status()}>");
            Output();
        }
示例#6
0
        private async Task AddOrUpdateProcessAsync(int moduleType, int subType = 0, int number = 0)
        {
            var process = await _examContext.ExamProcesss.SingleOrDefaultAsync();

            if (process == null)
            {
                process            = new ExamProcess();
                process.SubType    = subType;
                process.ModuleType = moduleType;
                process.Number     = number;
                process.AddTime    = DateTime.Now;
                _examContext.Add(process);
            }
            else
            {
                process.ModuleType = moduleType;
                process.SubType    = subType;
                process.Number     = number;
                process.AddTime    = DateTime.Now;
                _examContext.Update(process);
            }
            await _examContext.SaveChangesAsync();
        }