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

转自:http://www.cnblogs.com/pon/archive/2010/05/19/1739373.html

 

在线程方法里写传委托,然后通过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 进度条
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值