暂停闹钟

时间:2018-10-05 15:05:23

标签: c# arrays datetime foreach

我必须为班级修改一个警报程序,但看不到为什么它不起作用。希望有人能给我一些见识。现在它的工作方式是在程序启动时会加载几个警报。

每个警报是添加到具有枚举AlarmState设置为“ On”的数组的Alarm类的对象。它遍历数组,如果一个警报与当前时间匹配,并且AlarmState为“ On”,警报将关闭,将DateTime变量“ snoozeTime”设置为将来的5秒,然后将状态更改为“ Snooze”。但是,如果它遍历数组,并且一个警报与snoozeTime相匹配,并且状态为“ Snooze”,则它将警报状态更改为“关”。

现在,状态更改,并且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
}

这是我正在使用的matchs方法:

// 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 :(得分:2)

对我来说,问题似乎在于您正在设置变量来确定何时应发出被打alarm的警报,但随后从不更新该警报以使其消失

让我们通过一些示例数据遍历代码:

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.

现在检查第二个if块。首先,我们检查闹钟时间(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.

第一个if块不会被击中(警报时间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

答案 1 :(得分:2)

正如马克西姆对您的问题的评论所说,您绝对应该在第一个If语句中检查alarm.State == AlarmState.On,否则您的警报将连续与两个if语句匹配。

我更担心的是,一旦满足alarm.Matches(currTime),您就设置了alarm.State == AlarmState.Snooze,但是您似乎从未更新过设置闹钟的时间。这意味着alarm.Matches(snoozeTime) && alarm.State == AlarmState.Snooze永远不会正确,因为设置闹钟的时间已经过去。