| 
 
积分40186好友记录主题帖子听众收听 
 | 
 
 发表于 2013-3-25 14:08:26
|
显示全部楼层 
| http://www.sufeinet.com/thread-13-1-1.html其实我的例子里有关于这块的使用,只是没有单独放出来。 
 线程与线程之间是不能直接通信 的,当然使用委托就不一样了。
 这是典型的使用委托访问控件。
 在子线程不能直接访问其它线程创建的控件变量,或者是直接变量。要想访问最好的办法就是使用这个委托
 
 [code=csharp]
 //创建一个委托,是为访问TextBox控件服务的。
 public delegate void UpdateTxt(string msg);
 //定义一个委托变量
 public UpdateTxtReceive updateTxt;
 
 //修改TextBox值的方法。
 public void UpdateTxtMethod(string msg)
 {
 this.txt.Text=msg;
 }
 //此为在非创建线程中的调用方法,其实是使用TextBox的Invoke方法。
 public void ThreadMethodTxt(string msg)
 {
 this.txt.Invoke(updateTxtReceive, new object[] { msg });
 }[/code]
 其实楼主在使用时加载这部分可以这样写
 [code=csharp]updateTxt=new UpdateTxtReceive(UpdateTxtMethod)[/code]
 这样就行了,
 而 this.txt.Invoke(updateTxtReceive, new object[] { msg });同样也可以修改为
 [code=csharp] this.txt.Invoke(updateTxtReceive, msg );[/code]
 或者是[code=csharp]updateTxtReceive(msg)[/code]
 不过也不知道什么原因楼主的代码可能存在一个小问题那就是 你定义的委托实例为updateTxt而你一直使用的是updateTxtReceive,还有UpdateTxtReceive 委托从来没有出现过,楼主定义的是UpdateTxt而下面怎么出现updateTxtReceive呢?如果只是这样是没有办法实现楼主所说的效果的,
 我修改如下
 所代码应该修改为如下所示
 [code=csharp]  //创建一个委托,是为访问TextBox控件服务的。
 public delegate void UpdateTxt(string msg);
 //定义一个委托变量
 public UpdateTxt updateTxt;
 
 private void Form1_Load(object sender, EventArgs e)
 {
 updateTxt = new UpdateTxt(UpdateTxtMethod);
 }
 //修改TextBox值的方法。
 public void UpdateTxtMethod(string msg)
 {
 this.txt.Text = msg;
 }
 //此为在非创建线程中的调用方法,其实是使用TextBox的Invoke方法。
 public void ThreadMethodTxt(string msg)
 {
 this.txt.Invoke(UpdateTxt, new object[] { msg });
 //以下是苏飞修改部分
 //this.txt.Invoke(updateTxt, new object[] { msg });
 //updateTxt(msg)
 //如果是窗体的可以这样写
 //  this.BeginInvoke(updateTxt, msg);
 }
 [/code]
 这样就可以实例了,
 关键这块的可以参考一下我上面发的例子,或者是参考一下这个
 http://www.sufeinet.com/forum.php?mod=viewthread&tid=2153
 
 | 
 |