首页  /  留言  /  音乐  /  管理

如何在子线程中操作窗体上的控件

http://www.cnblogs.com/cm8448940/archive/2008/07/10/1240045.html

这是一部分重要的代码,用VS2005通过。

使用到两个控件,一个按钮button1,一个标签label1。


private void button1_Click(object sender, EventArgs e)

{

Thread thread=new Thread(new ThreadStart(myname));

thread.IsBackground=true;

thread.Start();

// 启动一个线程。

}

private void myname()

{

MethodInvoker mi = new MethodInvoker(hello);

//创建一个委托,hello是该委托所托管的代码,必须是声明为void的。

Invoke(mi);//同步执行委托。

//BeginInvoke(mi);异步执行委托。

}

private void hello()

{

label1.Text = "我是跨线程的!";

}


那里不正确,一定要指出,我可不想误导人,也不想被自己误导。

PS:写完后我发现http://tb.blog.csdn.net/TrackBack.aspx?PostId=715064早就有解释,比我的还详细,领教了。

故补充以下代码:

private Thread myThread;
private void Form1_Load(object sender, EventArgs e)
{
myThread = new Thread(new ThreadStart(RunsOnWorkerThread));
myThread.Start();
}
private void RunsOnWorkerThread()
{
//DoSomethingSlow();
string pList = "myThread线程调用UI控件";
label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);
}
//直接用System.EventHandler,没有必要自定义委托
private void UpdateUI(object o, System.EventArgs e)
{
//UI线程设置label1属性
label1.Text = o.ToString() + "成功!";
}

 

http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx

一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。

 

现在用一个用线程控制的进程条来说明,大致的步骤如下:

1. 创建Invoke函数,大致如下:

        /// <summary>

        /// Delegate function to be invoked by main thread

        /// </summary>

        private void InvokeFun()

        {

            if( prgBar.Value < 100 )

                prgBar.Value = prgBar.Value + 1;

        }

 

2. 子线程入口函数:

        /// <summary>

        /// Thread function interface

        /// </summary>

        private void ThreadFun()

        {

            //Create invoke method by specific function

            MethodInvoker mi = new MethodInvoker( this.InvokeFun );

 

            for( int i = 0; i < 100; i++ )

            {

                this.BeginInvoke( mi );

                Thread.Sleep( 100 );

            }

        }

 

3. 创建子线程:

            Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );

            thdProcess.Start();

 

       备注:

              using System.Threading;

              private System.Windows.Forms.ProgressBar prgBar;

首先,你在创建这个类的对象时,要把当前的窗体对象传进去(为了到时候能通过它调用其的方法)。
然后把
Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );
改成
Thread thdProcess = new Thread( new ThreadStart( yourObj.ThreadFun ) );
即可。
作者:Wilber 类别:编程学习 时间:2010/11/4 16:15:49 评论:0 点击211
标签:  webczw,伟博小城
打印:  打印本页
字体:  
本页地址:  http://www.webczw.com/s/201011416154980127.html
上一篇:如何向线程传递参数
下一篇:c#中多线程访问winform控件

  评论    
当第一个评论者吧!抢沙发>>
  
昵    称: Wilber
形    象:
内    容:
验证码:   
以上网友发言只代表其个人观点,不代表伟博小城的观点或立场。
  Copyright © 2010 - 2016 WEBCZW.COM, All Rights Reserved
伟博小城  版权所有 网站统计
粤ICP备14091989号