- 积分
- 40165
- 好友
- 记录
- 主题
- 帖子
- 听众
- 收听
|
发表于 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
|
|