Winform中多线程用户界面(一):故事的开始

第一个demo:
运行开始的时候的界面:用于计算得到PI后的小数。

主要代码如下:
下面是2个方法:一个用于显示进度条,一个用于计算PI值。
void ShowProgress(string pi,int totalDigits,int digitsSoFar)

        
{
            
this.piTextBox.Text=pi;
         this.piProgressBar.Properties.Maximum=totalDigits;
            this.piProgressBar.Text=digitsSoFar.ToString();
        }

void CalcPi(int digits)
        
{
        StringBuilder  pi
=new StringBuilder("3",digits+2);
            
//展示进度
            ShowProgress(pi.ToString(),digits,0);
        
            
if( digits > 0 ) 
            
{
                pi.Append(
".");

                
forint i = 0; i < digits; i += 9 ) 
                
{
                    
int nineDigits = NineDigitsOfPi.StartingAt(i+1);
                    
int digitCount = Math.Min(digits - i, 9);
                    
string ds = string.Format("{0:D9}", nineDigits);
                    pi.Append(ds.Substring(
0, digitCount));
                    
//展示进度
                    ShowProgress(pi.ToString(),digits,i+digitCount);
                }

            }

        }

当单击“计算“按钮的时候,事件响应函数是:
private void simpleButton1_Click(object sender, System.EventArgs e)
        
{
         CalcPi((
int)digitsUpDown.Value);
        }

      结果自然是很让人失望的,因为只有在CalcPi((int)digitsUpDown.Value)方法返回以后窗体才重新为你绘制控件并更新整个UI(处理Paint事件),在simpleButton_Click事件返回之前,无法处理其他事件,所以在pi的所有位都被计算完毕之前,用户将看不到任何后续计算进度的显示。也就是说计算的结果是一下子全部显示出来的而不是一部分一部分的显示出来,进度条也是一下就到头了。
      特别是当这个需要计算的位数比较的时候,我试过了700,是没问题的,但是是要计算出PI后的1000位,那么只要切换到其他的应用程序然后又回来,那么窗体就是这个样子的了。
   
                                  没有为你绘制

             所以这个demo不符合我们自己的要求。
             应该如何解决呢?
             欲知后事如何请听下回详解。


posted @ 2006-02-24 12:01  人月  阅读(2398)  评论(5编辑  收藏  举报