private int MyBaseNumber = 0;
private int MyPercentage = 0;
//计算菲波拉叶数
long ComputeFibonacci(int n, BackgroundWorker MyWorker, DoWorkEventArgs e)
{
long MyResult= 0;
if (MyWorker.CancellationPending)
{
e.Cancel = true;
}
else
{
if (n < 2)
{
MyResult= 1;
}
else
{
MyResult= ComputeFibonacci(n - 1, MyWorker, e) +
ComputeFibonacci(n - 2, MyWorker, e);
}
int MyPercentComplete=(int)((float)n / (float)MyBaseNumber * 100);
if (MyPercentComplete > MyPercentage)
{
MyPercentage = MyPercentComplete;
MyWorker.ReportProgress(MyPercentComplete);
}
}
return MyResult;
}
//开始计算
private void button1_Click(object sender, EventArgs e)
{
try
{
MyBaseNumber = Convert.ToInt16(this.textBox1.Text);
if ((MyBaseNumber < 0) || (MyBaseNumber > 91))
{
MessageBox.Show("计算基数应在1-91之间!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
MyPercentage = 0;
backgroundWorker1.RunWorkerAsync(MyBaseNumber);
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//取消计算
private void button2_Click(object sender, EventArgs e)
{
if (this.backgroundWorker1.IsBusy)
{
this.backgroundWorker1.CancelAsync();
}
else
{
MessageBox.Show("没有计算操作!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result= ComputeFibonacci((int)e.Argument, worker, e);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
else if (e.Cancelled)
{
MessageBox.Show("计算操作被取消!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
this.textBox2.Text = e.Result.ToString();
}
}
private int MyPercentage = 0;
//计算菲波拉叶数
long ComputeFibonacci(int n, BackgroundWorker MyWorker, DoWorkEventArgs e)
{
long MyResult= 0;
if (MyWorker.CancellationPending)
{
e.Cancel = true;
}
else
{
if (n < 2)
{
MyResult= 1;
}
else
{
MyResult= ComputeFibonacci(n - 1, MyWorker, e) +
ComputeFibonacci(n - 2, MyWorker, e);
}
int MyPercentComplete=(int)((float)n / (float)MyBaseNumber * 100);
if (MyPercentComplete > MyPercentage)
{
MyPercentage = MyPercentComplete;
MyWorker.ReportProgress(MyPercentComplete);
}
}
return MyResult;
}
//开始计算
private void button1_Click(object sender, EventArgs e)
{
try
{
MyBaseNumber = Convert.ToInt16(this.textBox1.Text);
if ((MyBaseNumber < 0) || (MyBaseNumber > 91))
{
MessageBox.Show("计算基数应在1-91之间!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
MyPercentage = 0;
backgroundWorker1.RunWorkerAsync(MyBaseNumber);
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//取消计算
private void button2_Click(object sender, EventArgs e)
{
if (this.backgroundWorker1.IsBusy)
{
this.backgroundWorker1.CancelAsync();
}
else
{
MessageBox.Show("没有计算操作!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result= ComputeFibonacci((int)e.Argument, worker, e);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
else if (e.Cancelled)
{
MessageBox.Show("计算操作被取消!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
this.textBox2.Text = e.Result.ToString();
}
}