0

有人和我有类似的问题;但他们实际上并没有得到有效的答案。我可以通过创建一个 bool 并在它进入 if 语句后将其设置为 false 来使其工作。我在使用该方法之前已经完成了,但是,我想知道是否有更清洁的方法。

问题: 为什么当我在计时器中使用带有简单确定按钮的消息框时,有人必须单击确定?否则你每秒都会收到相同的消息?在下面的代码中;它每隔一秒弹出一次,因为这是计时器设置的操作(滴答一秒),但它应该只在计时器达到 10 时显示一次,如下面的代码所示,但计时器仍应“滴答”因为它显示在标签中。

在有人将我撕成碎片之前,因为我注意到人们出于某种原因喜欢在这里做事;我的逻辑是,由于秒 = 10,它应该显示一次。当秒 = 11 时,它会显示一个额外的框是没有意义的,因为它是 11 而不是 10。我也想知道是什么原因造成的?

private void randomtimer_Tick(object sender, EventArgs e)
    {

        if (seconds == 10)
        {
            MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
        }
        seconds++;            
        if (seconds >= 60)
        {
            seconds = 0;
            minutes = minutes + 1;  
        }
        if (minutes >= 60)
        {
            minutes = 0;
            hours = hours + 1;
        }

        string niceTime = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", hours, minutes, seconds); //format the time so it displays nicely
        label2.Text = "Session Length:\n" + niceTime;
    }
4

3 回答 3

3

简单的答案是,因为seconds直到MessageBox.Show(). 在测试之前移动它if (seconds == 10),您的代码将起作用。

执行流程停止,MessageBox.Show()然后触发另一个 Time 事件。在涉及计时器时,您必须始终小心重新进入。

于 2013-06-29T20:48:33.533 回答
0

我会尽量简单地解释这一点。

当定时器的处理程序被调用时,计数器不会被阻塞。您提供的功能每秒钟(计时器的间隔)都会运行。现在,当您显示 时MessageBox,计时器处理程序的线程被阻塞。因此,增加秒的代码将不会运行,直到用户单击“确定”并且函数恢复。

现在,如果用户不按 OK,则秒数将停留在 10。1 秒后,计时器将再次调用处理程序,您if将运行,因为该值仍为 10。

如果要防止这种情况,请使用如下代码:

        if (seconds == 10)
        {
            seconds++;
            MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
        }
        else
            seconds++;

当然还有更好的方法,但这会奏效。

于 2013-06-29T20:50:55.107 回答
0

有人必须点击确定;否则你每秒都会收到相同的消息?

现在,这是你的问题。再看代码:

if (seconds == 10)
{
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
seconds++;

秒数直到MessageBox.Show被解雇后才会增加。将其更改为:

if (seconds == 10)
{
    seconds++;
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
else seconds++;

这将解决您的问题。

于 2013-06-29T20:51:51.007 回答