如何在下一个计时器滴答之前倒计时并显示时间?

时间:2012-01-10 00:26:04

标签: c# timer

我正在尝试使用一个计时器,它将每隔5秒或按用户指定的时间间隔执行操作。

现在,我希望有一个函数,它将以10毫秒的间隔倒计时,直到第一个计时器的滴答为止。我已经玩过并找到了一种简单的方法,通过计算1/10的第一个定时器滴答间隔,但计算数字时并不代表任何东西。

如何倒数?

这就是我现在的样子,但我想改变它:

    private void tmrClickInterval_Tick(object sender, EventArgs e)
    {
        if (nudPlusMinus.Value == 0) tmrClickInterval.Interval = int.Parse(nudClickInterval.Value.ToString());
        else tmrClickInterval.Interval = random.Next(int.Parse(nudClickInterval.Value.ToString()) - int.Parse(nudPlusMinus.Value.ToString()), int.Parse(nudClickInterval.Value.ToString()) + int.Parse(nudPlusMinus.Value.ToString()));

        if (tmrClickInterval.Interval / 10 == 0) tmrNextClick.Interval = 1;
        else tmrNextClick.Interval = tmrClickInterval.Interval / 10;
        tmrNextClick.Start();
        content++;
        nextClick = tmrClickInterval.Interval;
        label1.Text = content.ToString();
    }

    private void tmrNextClick_Tick(object sender, EventArgs e)
    {
        if (nextClick <= 0) tmrNextClick.Stop();
        else
        {
            nextClick = nextClick - (tmrClickInterval.Interval / 10);
            lblNextClickCount.Text = (nextClick / 100).ToString();
        }
    }

2 个答案:

答案 0 :(得分:2)

首先,我不确定你到底要做什么,也是以10毫秒的间隔你正在推动计时器的最小分辨率。见SO question。也就是说,您可以尝试使用Diagnostics.Stopwatch类来计算Tick事件之间的间隔。像这样:

private void tmrClickInterval_Tick(object sender, EventArgs e)
    {
        stopWatch.Stop();
        stopWatch.Reset();         
        stopWatch.Start();
        tmrNextClick.Start();
        content++;
        label1.Text = content.ToString();
    }

    private void tmrNextClick_Tick(object sender, EventArgs e)
    {
        nextClick = (((tmrClickInterval.Interval) - stopWatch.ElapsedMilliseconds) / 10) * 10;
        if (!(nextClick < 0))
        {
            lblNextClickCount.Text = nextClick.ToString();
        }
    } 

答案 1 :(得分:2)

您似乎正在尝试计算两个间隔,一个长间隔和一个短间隔,而长间隔是短间隔的倍数。

如果效率不是很重要(它不太可能),那么我认为我只有一个计时器可以缩短间隔时间。你知道有多少'短标记'等于'长标记',所以只要计算一下有多少短标记,当你有足够数量时,就可以解雇你的“长标记事件”。

有两个计时器,你可以获得各种竞争条件。你的“短期嘀嗒”可能会在“长期嘀嗒”之前触发,或者它可能会反过来发生。这两个计时器可能相互之间存在抖动(尽管它们的平均值相差不大),因此无法确定哪个会在任何给定时间首先触发。使用单个计时器,您可以控制所有这些因素。