我正在尝试使用一个计时器,它将每隔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();
}
}
答案 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)
您似乎正在尝试计算两个间隔,一个长间隔和一个短间隔,而长间隔是短间隔的倍数。
如果效率不是很重要(它不太可能),那么我认为我只有一个计时器可以缩短间隔时间。你知道有多少'短标记'等于'长标记',所以只要计算一下有多少短标记,当你有足够数量时,就可以解雇你的“长标记事件”。
有两个计时器,你可以获得各种竞争条件。你的“短期嘀嗒”可能会在“长期嘀嗒”之前触发,或者它可能会反过来发生。这两个计时器可能相互之间存在抖动(尽管它们的平均值相差不大),因此无法确定哪个会在任何给定时间首先触发。使用单个计时器,您可以控制所有这些因素。