2012-04-02 47 views
0

更新:我已经设法解决我的问题。使用下面的代码,我移动我的MessageBox后,我的XML保存并将计时器从100ms更改为400ms。我现在有1个盒子出现,谢天谢地。虽然如果有人在List数组(ActListTask)中更新单个值(ActReminded)的捷径,那很好理解。有MessageBox出现一次(代码在计时器内)

我在显示MessageBox时遇到了一点问题。在计时器内显示,不会将垃圾邮件发送给我。下面的代码中我一直在与部分:

public class ActiveTasks 
    { 
     //Properties here 
    } 

public List<ActiveTasks> ActTaskList = new List<ActiveTasks>(); 

for (int i = 0; i < ListActive.Items.Count; i++) 
     { 
      if (DTime.Date == newDateTime.Date) 
      { 
       if (newDateTimeLeft.CompareTo(TimeSpan.Zero) <= 0 && ActTaskList[i].ActReminded != "true") 
       { 
        MessageBox.Show("!!!!"); 
        ActTaskList.Add(new ActiveTasks() 
        { 
         ActTitle = ActTaskList[i].ActTitle, 
         ActDesc = ActTaskList[i].ActDesc, 
         ActDate = ActTaskList[i].ActDate, 
         ActTime = ActTaskList[i].ActTime, 
         ActStatus = ActTaskList[i].ActStatus, 
         ActReminded = "true", 
         ActRepeat = ActTaskList[i].ActRepeat 
        }); 

        ListActive.Items.RemoveAt(i); 

        ActTaskList.RemoveAt(i); 

        XDocument XmlActTasks = GenerateActiveListToXML(ActTaskList); 
       } 
      } 
     } 

其实我决定,我可能要守住提醒状态,它是否已被证明或者还不如我不想重复提醒每程序打开的时间。由于我不知道更新ActTaskList的某个部分的方法,我只是重新添加它,然后删除原始文件。此代码设法识别出它是否发生,它会将提醒状态从false更改为true;在我确定了所有的垃圾邮件之后。所以一旦我设法关闭所有的Messagebox,它就会停止MessageBox。但是,它不会阻止垃圾邮件。这是否与我将计时器设置为100ms的事实有关?或者他们可以成为另一种让消息框出现而不在定时器内的方式?

+0

你在哪里声明了定时器?你正在使用哪种类型的计时器? – 2012-04-02 18:40:58

+3

有一个'bool',当用户出现时,将'bool'设置为false,只有当'bool'为true时才会提醒。 – Matthew 2012-04-02 18:41:23

+1

**您想要完成什么?**从它的声音中,您需要一定的延迟后的一个消息框。那是你要的吗? – Ryan 2012-04-02 18:41:35

回答

0

你能做这样的事吗?

Action message =() => MessageBox.Show("!!!!!!!!!!!!!")); 
object lockOb = new object(); 

void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    lock(lockOb) 
     if(null != message) 
     { 
      message(); 
      message = null; 
     } 
} 
+0

这只是使消息框垃圾我死。 – MattVon 2012-04-02 19:03:34

+0

我编辑并添加了一个锁。这确实是你的问题,因为'OK'按钮等着你回来,它永远不会被设置为空。但是在锁定之后,直到锁定退出后才会再次检查该消息。 – 2012-04-02 19:04:49

+0

你的更新没有解决它。给我一下,我会更新我原来的问题。 – MattVon 2012-04-02 19:11:21

1

当前时间与您的循环中正好发生的第二次事件的几率很小。为什么不把newDateTime当作关键点并设置一个标志?

//Declare this outside of the loop 
bool hasDisplayed = false; 

//Inside the timer event handler 
if (!hasDisplayed && DateTime.Now >= newDateTime) 
{ 
    hasDisplayed = true; 

    MessageBox.Show("!!!!!!!!!!!!!"); 
} 
0

你说你已经尝试过一个布尔值,表明消息已经表明,我假设,因为代码可能看起来像它那样的下方。

void TimerLoop() 
{ 
    bool msgAlreadyShown; 

    if(!msgAlreadyShown) 
    { 
     MessageBox.Show("!!!!!!!"); 
    } 
    // Other work in your timer function 
} 

该代码的问题在于,每次函数被定时器调用时,bool都将设置为false。你没有发布太多的代码,但你至少已经说明了你想要完成的任务,一个计时器,用于检查提醒是否应该呈现给用户。

我即将对如何将软件放在一起做出一些猜测,这是一个很好的机会,但我希望它可能会指向正确的方向。你可能有某种提醒类的这样的:

public class Reminder 
{ 
    string Message { get; set;} 
    DateTime Alarm { get; set; } 
    bool IsDismissed { get; set; } 
} 

我假设你可能希望能在计时器循环来检查多个提醒,让您的计时器循环可能看起来像:

private List<Reminder> _activeReminders; // A list of reminders 

void TimerLoop(object s, ElapsedEventArgs e) 
{ 
    lock(_activeReminders) 
    { 
     var now = DateTime.Now; 
     foreach(var reminder in _activeReminders) 
     { 
      // only run this code if the time has passed and it hasn't already 
      // been shown 
      if(now.CompareTo(reminder.Alarm) >= 0 && !reminder.IsDismissed) 
      { 
       MessageBox.Show(reminder.Message); 
       reminder.IsDismissed = true; 
      } 
     } 
    } 
} 

这是一个非常天真的实现,因为您可能不想永远保持提醒并且提醒不会从_activeReminders列表中删除,但您基本上只需添加某种状态以确定如果提醒已经显示。

当然,这也不是一个完整的例子,因为我从来没有新增_activeReminders字段或添加任何东西,但我认为这可能有助于了解您需要做什么。此外,你可能不关心多个提醒,你的计时器代码可能看起来不像这样。主要想法是向您展示如何跟踪提醒的状态,并将其定制为您自己的代码。以上只是一个例子。另外,我还没有真正测试过它,所以对待它更像伪代码而不是其他任何东西。但是,逻辑是正确的,应该只会导致消息框出现一次。

+0

这有点帮助。由于我已经有了一些列表,我只是在该类中添加了另一个公共字符串(因为我现在懒得弄清楚如何从XML读取bool)。但是,它不会阻止垃圾邮件的发送。 – MattVon 2012-04-06 17:19:50

+0

@MattVon - 那么你的问题可能在别的地方,或者你没有完全按照原样翻译上面的代码,以与你的应用程序一起工作。我只是测试了上面的代码,并没有给我发垃圾邮件。如果你删除了'_activeReminders'上的锁定,则可能在代码执行'MessageBox.Show()'时重新执行定时器,因为它可能会阻塞该线程。在这种情况下,您需要在显示消息框之前将'IsDismissed'设置为true *。过去,如果没有真正查看代码,我不确定自己能够提供多大的帮助。 – 2012-04-06 22:26:45

+0

我已更新我的问题,希望它可以帮助。 – MattVon 2012-04-07 11:20:56