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;
}
}
答案 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;
...
}
}