云南特产 健康论坛 创业论坛 一树百花 低空飞行  
             

水手

专注
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#多线程、跨线程、窗体同步、进度条

Posted on 2010-05-19 17:00  要每天开心  阅读(4325)  评论(0编辑  收藏  举报
在线程方法里写传委托,然后通过Invoke将该委托传递给GUI线程


public delegate void 委托类型(string msg);//首先声明一个委托类型
委托类型 委托变量;//声明该委托类型的成员

private void myButton_Click(object sender, EventArgs e)
{
     委托变量 = new 委托类型(委托方法);//委托与方法挂钩
     Thread t = new Thread(new ThreadStart(doSomeThing));//新开线程
     t.Start();//线程启动
}

private void doSomeThing()
{
     if (控件名.InvokeRequired)//如果跨线程调用
     {
         this.控件名.Invoke(委托变量, new object[] { "Message!" });//Invoke委托方法
     }
}

private void 委托方法(string p)//这个是委托方法。
{
     this.控件名.Text = p;
}

部份源码:
程序代码 程序代码


         #region 跨线程调用
         delegate void 跨线程委托( string text );
         跨线程委托 跨线程委托变量名;
         private int Pint = 0;


         //一、先将委托变量的方法指向为 跨线程委托方法
         //二、将线程的方法指向为 跨线程数数
         //三、在 跨线程数数 中BeginInvoke,参数为(委托变量,数字)
         //以上过程为先读取下一个数字,然后显示到myTextBox中
         private void button跨线程调用_Click( object sender , EventArgs e )
         {
             跨线程委托变量名 = new 跨线程委托 (跨线程委托方法);
             Thread thread = new Thread (new ThreadStart (跨线程数数));
             thread.Start (); //开始
         }

         private void 跨线程数数()
         {
             for(int i = 0 ; i < 20 ; i++)
             {
                 if(myTextBox.InvokeRequired)//如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false
                 {
                     myTextBox.BeginInvoke (跨线程委托变量名 , 跨线程数字增加 ());
                     Thread.Sleep (2000);
                 }
                 else
                 {
                     跨线程委托方法 (i.ToString ());
                 }
             }
         }

         private string 跨线程数字增加()
         {
             Pint = Pint + 1;
             return Pint.ToString ();
         }

         private void 跨线程委托方法( string text )
         {
             myTextBox.Text += text + System.Environment.NewLine;
             myTextBox.Refresh ();
         }

         #endregion 跨线程调用

         #region 进度条
         private delegate void 进度条委托( int myInt );
         private 进度条委托 进度条委托变量名;

         private void button进度条_Click( object sender , EventArgs e )
         {
             进度条委托变量名 = new 进度条委托 (进度条委托方法);
             Thread thread = new Thread (new ThreadStart (进度条数数));
             thread.Start ();
         }

         private void 进度条数数()
         {
             while(true)
             {
                 if(this.InvokeRequired)
                 {
                     if(Pint > 20)
                     {
                         MessageBox.Show ("进度条最大了");
                         break;
                     }
                     else
                     {
                         this.BeginInvoke (进度条委托变量名 , Pint++);
                     }
                 }
                 else
                 {
                     MessageBox.Show ("在同一线程");
                     break;
                 }
                 Thread.Sleep (200);
             }
         }

         private void 进度条委托方法( int myInt )
         {

             label进度条最大数.Text = myInt.ToString ();
             myTextBox.Text = myInt.ToString ();
             myTextBox.Refresh ();
             label进度条最大数.Refresh ();
             progressBar1.Value = myInt;
             progressBar1.Refresh ();
         }
         #endregion 进度条
             
  云南特产 健康论坛 创业论坛 一树百花 低空飞行