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()); } }
//Определяет перемещать ли студента в следующую очередь 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]; //Переходим к следующей } } } }
/// <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(); }
/// <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."); } } } }
/// <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(); }
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(); }