为什么在更改组合框项目时它没有以正确的方式更改时间计数?

时间:2015-02-19 12:39:44

标签: c# .net winforms

comboBox selectedindexchanged事件:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            updateTime = Convert.ToInt32(comboBox1.SelectedItem);
            xpProgressBar1.Position = 0;
            counter = 0;
            panel1.Select();
        }

更新方法:

public void Update()
        {
            counter += 1;
            int position = (int)Math.Round((counter / updateTime) * 100);
            xpProgressBar1.Text = counter.ToString() + " %";
            xpProgressBar1.Position = position;
            if (counter == 10)
            {
                if (!backgroundWorker1.IsBusy)
                {
                    timer1.Stop();
                    backgroundWorker1.RunWorkerAsync();
                }
                counter = 0;
            }
        }

计时器刻度事件:

private void timer1_Tick(object sender, EventArgs e)
        {
            Update();
        }

在combBox中,默认情况下,它在第一项10号然后我可以更改并选择数字为30,50,60,120,300的项目,所有这些值都以秒为单位。

timer1间隔设置为1000

问题是当它在运行程序时默认为10时,或者如果我在comboBox中将其更改回10,它运行良好。它的作用是计算10秒并将progressBar(xpProgressBar1)更新为10,我的意思是每一步progressBar移动10%。因此,10秒后,它达到100%。

但是当我将comboBox更改为第二项至30时,它应该现在计算30秒直到100%

所以我不确定它应该采取什么步骤以及如何进行。如果我将其更改为120则相同然后它应该将进度移动120秒再次我不确定哪些步骤以及如何执行它以使其达到100%

现在它做了什么,例如,如果我将其更改为120,我看到它开始按步数1开始计数,但是当它达到10%时,它会跳回到开始而不是继续。

它应该持续计算整个120秒直到100%

如果我将其更改为30,我会看到它每次还会以1为单位进行计数,但是再次以10%计算,它会跳到开头而不是继续。

当它在10时它按10步直到100%计算,所以我想知道我应该怎么做以及如果它在120以上120步之后怎么做?不是逻辑。所以,当它在10点的时候,它们一步一步地逐步走向1?再次如何做到这样它不会停止10%并重新开始。

现在我在Update方法中将行if(counter == 10)更改为:

if (counter == updateTime)

所以现在如果我在comboBox中更改选择120,它会以1为步进计数,直到120,但现在当它将progressBar变为100%时,它将继续计数直至120.

120秒与progressBar的100%之间没有同步。

修改

更新方法:

private int _updateCounter;
        public void Update()
        {
            counter += 1;
            xpProgressBar1.Text = counter.ToString() + " %";
            xpProgressBar1.Position = _updateCounter++ * 10;
            if (counter == 10)
            {
                if (!backgroundWorker1.IsBusy)
                {
                    timer1.Stop();
                    backgroundWorker1.RunWorkerAsync();
                }

                counter = 0;
            }
        }

1 个答案:

答案 0 :(得分:0)

这称为prescaler(分频器)。您有单个时钟源(Timer),其中最快频率,您可以通过跳过某些呼叫(事件)来获得所需的频率。

你唯一想念的是跳过

private int _timer1Ticks;
private void timer1_Tick(object sender, EventArgs e)
{
    if(_timer1Ticks++ >= int.Parse(comboBox1.Text) / 10)
    {
        _timer1Ticks = 0;
        Update();
    }
}

这种方式Update将被称为10次,无视组合框选择。

计算进度:

private int _updateCounter;
public void Update()
{
    xpProgressBar1.Position = _updateCounter++ * 10;
    ...
    // do not forget to stop timer
    if(_updateCounter == 10)
    {
        timer1.Stop();
        _updateCounter = 0; // add some cleanup if using timer more than once
        _timer1Ticks = 0;
        ...
    }
}