Отложить на будильник - PullRequest
       2

Отложить на будильник

0 голосов
/ 05 октября 2018

Мне нужно изменить программу тревоги для класса, и я не понимаю, почему она не работает.Надеясь, что кто-то может дать мне некоторое представление.Сейчас он работает так, что при запуске программы загружается пара аварийных сигналов.

Каждый сигнал тревоги - это объект класса Alarm, добавленный в массив с enum AlarmState, установленным в «On».Он проходит по массиву, и если один сигнал тревоги соответствует текущему времени, а AlarmState находится в состоянии «Вкл.», Сигнал тревоги отключается, устанавливает для переменной DateTime значение «snoozeTime» на 5 секунд в будущем и изменяет состояние на «Snooze».Тем не менее, если он проходит по массиву и один сигнал тревоги соответствует snoozeTime, а состояние равно «Snooze», тогда он изменяет состояние сигнала на «Off».

В данный момент состояние изменяется и переменная snoozeTimeнастроен правильно.Однако сигнал тревоги никогда не соответствует snoozeTime, хотя при печати snoozeTime он выглядит так, как будто он совпадает.Кроме того, если вам интересно, почему в будущем я устанавливаю режим сна только на 5 секунд, то это потому, что я пока не могу понять, как использовать нажатия клавиш.

Это важная часть основной программы.:

// Get current time.
DateTime currTime = DateTime.Now;
DateTime snoozeTime = new DateTime();
// Continually show current time until alarm time reached.
while (alarms.Length > 0)
{
    Console.WriteLine("Current time is: {0:HH:mm:ss}", currTime);

    // WRITE LOOP TO CHECK WHETHER ANY ALARMS MATCH.
    foreach (var alarm in alarms)
    {

        if (alarm.Matches(currTime))
        {
            Console.WriteLine("Alarm going off at: {0}", alarm.FormattedTime());
            //alarm.Minute += 1;
            snoozeTime = DateTime.Now.AddSeconds(5.0);
            alarm.State = AlarmState.Snooze;
            Console.WriteLine("Snooze set for: {0}", snoozeTime);
        }

        if (alarm.Matches(snoozeTime) && alarm.State == AlarmState.Snooze)
        {
            Console.WriteLine("Shutting off");
            //set state to off
            alarm.State = AlarmState.Off;
        }
    }  

    Thread.Sleep(1000);  // pause for a second

    currTime = DateTime.Now;  // update current time
}

Это метод совпадений, который я использую:

// Returns whether alarm should go off at time "when".
public bool Matches(DateTime when)
{

    return (State != AlarmState.Off && Hour == when.Hour && Minute == when.Minute && Second == when.Second);

    //return (State == AlarmState.On || State == AlarmState.Snooze) &&
        //Hour == when.Hour && Minute == when.Minute && Second == when.Second;
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Как сказал Максим в комментарии к вашему вопросу, вы обязательно должны отметить alarm.State == AlarmState.On в своем первом утверждении If, в противном случае ваша тревога будет совпадать с обоими, если утверждение последовательно.

Что меня больше беспокоитявляется то, что после достижения alarm.Matches(currTime) вы устанавливаете alarm.State == AlarmState.Snooze, но вы, кажется, никогда не обновляете время, когда установлен будильникЭто значение alarm.Matches(snoozeTime) && alarm.State == AlarmState.Snooze никогда не соответствует действительности, поскольку время, в которое установлен ваш будильник, уже прошло.

0 голосов
/ 05 октября 2018

Мне кажется, что вы устанавливаете переменную, чтобы определить, когда должен сработать дремлющий будильник, , но затем никогда не обновляете будильник, чтобы он сработал в это время .

Давайтепросмотреть код с некоторыми примерами данных:

You have 1 alarm set to go off at 10/5/2018 12:01:00 PM and current state is on.
The current time is 10/5/2018 12:00:59 PM.
The snooze time is 1/1/0001 12:00:00 AM.

Первый раз в цикле: Тревога не соответствует текущему времени, поэтому ни один из блоков if не используется.Программа спит в течение 1 секунды.Ваши данные выглядят так:

You have 1 alarm set to go off at 10/5/2018 12:01:00 PM and current state is on.
The current time is 10/5/2018 12:01:00 PM.
The snooze time is 1/1/0001 12:00:00 AM.

Теперь цикл запускается снова.Первый блок if ударил (время будильника совпадает с текущим временем (обратите внимание, что состояние будильника здесь не проверяется, возможно, ошибка?). Время повтора устанавливается на 5 секунд в будущем, и состояние будильникаустановите значение повтора. Таким образом, после этого, если блокировать, ваши данные будут такими:

You have 1 alarm set to go off at 10/5/2018 12:01:00 PM and current state is snooze.
The current time is 10/5/2018 12:01:00 PM.
The snooze time is 10/5/2018 12:01:05 PM.

Второй блок блока теперь проверен. Сначала мы проверяем время будильника (12:01:00 PM)соответствует времени повтора (12:01:05 PM). Нет, не соответствует, поэтому мы пропускаем блок if.

Давайте перепрыгнем через несколько итераций цикла туда, где время равно 12:01.: 17:00 (ни один из блоков if не будет достигнут за это время). Таким образом, ваши данные выглядят так:

You have 1 alarm set to go off at 10/5/2018 12:01:00 PM and current state is snooze.
The current time is 10/5/2018 12:01:05 PM.
The snooze time is 10/5/2018 12:01:05 PM.

Первый, если блок не попадет (время будильника 12: 01: 00 PM не соответствует текущему времени 12:01:05.) Как насчет второго блока if (тот, который вы ожидаете ударить)? Сначала включается время будильника (12:01:00 PM).соответствовать времени повтора (12:01:05 PM) Нет, поэтому будильник никогда не выключается (ваша текущая логика делает так,когда-либо совпадать).

Я подозреваю, что вам нужно сделать что-то вроде этого (псевдокод, чтобы вы могли выяснить особенности для себя):

//this is within your loop
if alarm matches the current time and the alarm state is on
    calculate the snooze time
    set the alarm's time to go off to the snooze time
    set the alarm's state to snooze

if alarm matches current time and the alarm state is snooze
    shut the alarm off
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...