多次调用计时器有奇怪的结果

时间:2016-02-26 20:01:00

标签: c#

当我按下button1时,tabatas的值立即从8变为1,然后timer1_tick方法正确地运行一次。

int goSecondsLeft = 20;
    int restSecondsLeft = 10;
    int tabatas = 8;

    public Form1()
    {
        InitializeComponent();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        if (goSecondsLeft >= 0)
        {
            lbGoOrRest.Text = "Go!";
            lbSecondsRemaining.Text = goSecondsLeft.ToString() + " seconds";
            goSecondsLeft--;
        }
        else if (restSecondsLeft >= 0)
        {
            lbGoOrRest.Text = "Rest";
            lbSecondsRemaining.Text = restSecondsLeft.ToString() + " seconds";
            restSecondsLeft--;
        }
        else
        {
            timerGo.Stop();

        }   

    }    

    private void button1_Click(object sender, EventArgs e)
    {
        while (tabatas > 0)
        {
            lbTabatasRemaining.Text = "Tabatas remaining" + tabatas.ToString();
            timerGo.Start();
            tabatas--;
        }
    }

我在线上设置了一个断点(tabataas> 0)并继续进入,每次执行while循环时,tabata的值按预期下降了一个,但是当我运行程序时它立即进入1而timer1_tick方法继续运行。

我的工作代码如下:

           else
        {
            goSecondsLeft = 20;
            restSecondsLeft = 10;
            tabatas--;
            lbTabatasRemaining.Text = "Tabatas remaining" + tabatas.ToString();
            timerGo.Stop(); 
        }   

    }    

    private void button1_Click(object sender, EventArgs e)
    { 
            timerGo.Start();
    }

1 个答案:

答案 0 :(得分:3)

你的std::string* getName(int Instance) { return (std::string*)(*(int*)(Instance + 0x28)); } for (auto &i : getChildren(Players)) { this->playerList->Items->Add(getName(i)); } 循环中没有任何内容可以导致延迟,所以它几乎瞬间完成。也许你认为{{1}}会阻塞一段时间,但事实并非如此。它只是在后台启动计时器并立即返回。

不确定您到底要做什么,但如果您希望{{1}}变量随时间缩小,请删除循环并在计时器事件处理程序中递减变量。