簡體   English   中英

讓MessageBox出現一次(計時器內的代碼)

[英]Have MessageBox appear once (code inside timer)

更新:我已經設法解決了我的問題。 使用下面的代碼,在保存XML之后移動了MessageBox,並將Timer從100ms更改為400ms。 我現在有1個盒子出現,感謝上帝。 盡管如果有人在更新列表數組(ActListTask)中的單個值(ActReminded)方面有捷徑,那真是太好了。

我在顯示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; 確定所有垃圾郵件之后。 因此,一旦我設法關閉所有消息框,它將停止消息框。 但是,它不會阻止垃圾郵件。 我將計時器設置為100毫秒與這有什么關系嗎? 還是它們可以成為使消息框不出現在計時器內的另一種方式?

當前時間精確到秒的幾率很小。 為什么不將newDateTime視為截止點並僅設置標志?

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

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

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

你可以做這樣的事情嗎?

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

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

您說您已經嘗試過一個布爾值,指示消息已經顯示,我認為是因為代碼可能看起來像下面那樣。

void TimerLoop()
{
    bool msgAlreadyShown;

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

該代碼的問題在於,每次計時器調用函數時,布爾值都將設置為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字段或在其中添加任何內容,但是我認為這可能有助於您了解需要做的事情。 另外,您可能不關心多個提醒,並且您的計時器代碼可能看起來像這樣。 主要思想是向您展示如何跟蹤提醒的狀態,並將其定制為自己的代碼。 以上僅是示例。

另外,我還沒有真正測試過它,因此將它像偽代碼一樣對待。 但是,邏輯是合理的,應該只使消息框出現一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM