Exemple #1
0
 internal bool TryAdd(ScheduleTask newTask)
 {
     if (_tasks.Any(t => t.Intersection(newTask)))
     {
         return(false);
     }
     _tasks.Add(newTask);
     return(true);
 }
Exemple #2
0
 internal bool Intersection(ScheduleTask newTask)
 {
     if (Stop <= newTask.Start)
     {
         return(false);
     }
     else if (newTask.Stop <= Start)
     {
         return(false);
     }
     return(true);
 }
Exemple #3
0
 ///<summary>Расписание изменено</summary>
 private void ScheduleChange()
 {
     _currentScheduleTask = _schedule?.GetCurrentScheduleTask();
     _cancellationTokenSource.Cancel();
     _cancellationTokenSource.Dispose();
     _cancellationTokenSource = new CancellationTokenSource();
     //Если сейчас не проигрывается видео, то переходим к следующему видео.
     if (string.IsNullOrEmpty(CurrentVideoSource))
     {
         ToNextVideo();
     }
     //Если проигрывается видео, то просто выходим, из нового расписание видео включится когда произойдёт вызов ToNextVideo
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        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());
        }
Exemple #6
0
        ///<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);
        }