internal bool TryAdd(ScheduleTask newTask) { if (_tasks.Any(t => t.Intersection(newTask))) { return(false); } _tasks.Add(newTask); return(true); }
internal bool Intersection(ScheduleTask newTask) { if (Stop <= newTask.Start) { return(false); } else if (newTask.Stop <= Start) { return(false); } return(true); }
///<summary>Расписание изменено</summary> private void ScheduleChange() { _currentScheduleTask = _schedule?.GetCurrentScheduleTask(); _cancellationTokenSource.Cancel(); _cancellationTokenSource.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); //Если сейчас не проигрывается видео, то переходим к следующему видео. if (string.IsNullOrEmpty(CurrentVideoSource)) { ToNextVideo(); } //Если проигрывается видео, то просто выходим, из нового расписание видео включится когда произойдёт вызов ToNextVideo }
internal TimeSpan GetTimeToNextScheduleTask() { var time = DateTime.Now.TimeOfDay; ScheduleTask curScheduleTask = null; double curToTaskmms = double.MaxValue; //Поиск ближайшей по времени задачи foreach (var task in _tasks) { var interval = (task.Start - time).TotalMilliseconds; if (interval < 0) { continue; } if (interval < curToTaskmms) { curToTaskmms = interval; curScheduleTask = task; } } if (curScheduleTask != null) { return(TimeSpan.FromMilliseconds(curToTaskmms)); } //Ближайшая задача в следующем дне //Поиск ближайшей по времени задачи var startDaytime = TimeSpan.FromMilliseconds(0); var timeToFinishDay = TimeSpan.FromDays(1) - time; foreach (var task in _tasks) { var interval = (task.Start - startDaytime).TotalMilliseconds; if (interval < 0) { continue; } if (interval < curToTaskmms) { curToTaskmms = interval; curScheduleTask = task; } } if (curScheduleTask == null) { throw new Exception("Неверно собранное расписание оно пустое"); } return(TimeSpan.FromMilliseconds(curToTaskmms) + timeToFinishDay); }
private void ToNextScheduleTask() { _currentScheduleTask = _schedule?.GetCurrentScheduleTask(); //Если текущая задача из расписания успешно установлена if (_currentScheduleTask != null) { //Просто устанавливает следующее видео из текущегозадания ToNextVideo(); return; } //Если расписание отсутвует if (_schedule == null) { return; //Просто выходим следующий запус расчитан на ввод нового расписания } //Т.к. текущего задания нет, необходимо определить следующую задачу из расписания var nextT = _schedule.GetTimeToNextScheduleTask(); Task.Delay(nextT, _cancellationTokenSource.Token).ContinueWith((t) => ToNextVideo(), _cancellationTokenSource.Token, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); }
///<returns>В случае если в кортеже отсутсвует объект (null) то в котреже содежится описание ошибки.</returns> internal static (Schedule BuildResult, string BuildError) Build(string[] scheduleStrs) { var schedule = new Schedule(); foreach (var str in scheduleStrs) { if (string.IsNullOrEmpty(str)) { return(null, "Присутствует пустая строка"); } var splites = str.Split(' '); if (splites.Length != 3) { return(null, $"В строке {str} не три элемента разделённых пробелом"); } TimeSpan startTime; TimeSpan stopTime; if (!TimeSpan.TryParseExact(splites[0], @"hh\:mm", CultureInfo.InvariantCulture, out startTime)) { return(null, $"В строке {str} начальное время ({splites[0]}) задано неверно."); } if (!TimeSpan.TryParseExact(splites[1], @"hh\:mm", CultureInfo.InvariantCulture, out stopTime)) { return(null, $"В строке {str} начальное время ({splites[1]}) задано неверно."); } if (startTime >= stopTime) { return(null, $"В строке {str} конечное время раньше начального."); } if (!Directory.Exists(splites[2])) { return(null, $"Директории {splites[2]} не существует"); } var scheduleTask = new ScheduleTask(startTime, stopTime, splites[2]); if (!schedule.TryAdd(scheduleTask)) { return(null, $"Событие {str} пересекается с ранее описанным событием."); } } return(schedule, null); }