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

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

Каждый аварийный сигнал является объектом класса Alarm, добавленного в массив, с параметром Alarmum, указанным в EnumStateStation, в положение «Вкл.». Он перемещается по массиву, и если один сигнал тревоги совпадает с текущим временем, а AlarmState - «Вкл.», Сигнал тревоги отключается, в будущем значение переменной «TimeTime» устанавливается на «snoozeTime» до 5 секунд и изменяет состояние на «Отложить». Однако, если он проходит через массив, и один сигнал тревоги соответствует 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 ответа


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

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

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.

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

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:05 PM (ни один из блоков 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 PM). Как насчет второго блока 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

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

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


Есть идеи?

10000