线程与控件交互问题?

hesihai2010 2010-11-06 12:41:59
我在程序中想实现工作线程中获得主线程中textbox中的值,代码如下:

声明了一个线程:
private Thread connthread;

声明一个委托:
public delegate IPAddress GetIPdelegate();

声明了一个方法:
public IPAddress GetIPaddress()
{
IPAddress ipaddressNum;
ipaddressNum = IPAddress.Parse(this.textBox1.Text);
return ipaddressNum;
}

封装方法:

GetIPdelegate GetIPmethod = new GetIPdelegate(GetIPaddress);用INVOKE方法 调用委托:

调用委托:
private void connection()
{
IPAddress ipaddress;
ipaddress = this.Invoke(GetIPmethod);
........
}

在按钮事件中启动线程:
private void button1_Click(object sender, EventArgs e)
{
connthread = new Thread(new ThreadStart(connection));
connthread.Start();
}


但是在点击按钮button1时,就会报错:“Control.Invoke 必须用于与在独立线程上创建的控件交互。”,不知道问题出在哪里?
...全文
163 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hesihai2010 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 colorall 的回复:]
引用楼主 hesihai2010 的回复:
我在程序中想实现工作线程中获得主线程中textbox中的值,代码如下:

声明了一个线程:
private Thread connthread;

声明一个委托:
public delegate IPAddress GetIPdelegate();

声明了一个方法:
public IPAddress GetIPaddress()
……
[/Quote]

代码很详细,我试过了可以没有错误了,非常感谢!!!
hesihai2010 2010-11-06
  • 打赏
  • 举报
回复
嗯,谢谢sp1234了,问题终于搞定了,问题出在委托概念没有搞明白。但还有个问题就是
textbox1.Invoke(GetIPmethod);与GetIPmethod.Invoke();有什么不同,我主要是要提取textbox1中的值,为什么前者可以后者不可以?

修改成功后的代码如下:

声明了一个线程:
private Thread connthread;

声明一个全局变量:
private IPAddress ipaddress;

声明一个委托:
public delegate void GetIPdelegate();

声明了一个方法:
public void GetIPaddress()
{
ipaddress = IPAddress.Parse(this.textBox1.Text);
}

封装方法:

GetIPdelegate GetIPmethod = new GetIPdelegate(GetIPaddress);用INVOKE方法 调用委托:

调用委托:
private void connection()
{
ipaddress = textbox1.Invoke(GetIPmethod); //获取成功

//ipaddress = GetIPmethod.Invoke(); //获取失败
........
}

在按钮事件中启动线程:
private void button1_Click(object sender, EventArgs e)
{
connthread = new Thread(new ThreadStart(connection));
connthread.Start();
}


再次感谢帮忙解答的兄弟们。学到很多。
pedcode 2010-11-06
  • 打赏
  • 举报
回复
应该要委托把
colorall 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 hesihai2010 的回复:]
我在程序中想实现工作线程中获得主线程中textbox中的值,代码如下:

声明了一个线程:
private Thread connthread;

声明一个委托:
public delegate IPAddress GetIPdelegate();

声明了一个方法:
public IPAddress GetIPaddress()
{
IPAddress ipaddressN……[/Quote]

你这个没问题,我试过了,没有错误提示。如下:

public partial class Form1 : Form
{
private Thread connthread;
public delegate IPAddress GetIPdelegate();

GetIPdelegate GetIPmethod;
public Form1()
{
InitializeComponent();
GetIPmethod = new GetIPdelegate(GetIPaddress);
}
public IPAddress GetIPaddress()
{
IPAddress ipaddressNum;
ipaddressNum = IPAddress.Parse(this.textBox1.Text);
return ipaddressNum;
}
private void connection()
{
IPAddress ipaddress;

ipaddress = this.Invoke(GetIPmethod) as IPAddress;

}
private void button1_Click(object sender, EventArgs e)
{
connthread = new Thread(new ThreadStart(connection));
connthread.Start();
}
}

  • 打赏
  • 举报
回复
嗯,单纯读取值其实不需要任何Invoke,从线程中直接读就是了,不需要Invoke。

当修改控件,那么要首先使用 InvokeRequired 来判断一下是否一定需要Invoke。
hesihai2010 2010-11-06
  • 打赏
  • 举报
回复
谢谢上面的兄弟,我看了很多都是跨线程操作主线程的控件属性,但是工作线程从主线程获取值怎样实现呢?比如我工作线程想要获得主线程中一个textbox中的值。
inttlegence 2010-11-06
  • 打赏
  • 举报
回复
private void connection()
{
IPAddress ipaddress;
ipaddress = this.Invoke(new GetIPdelegate(GetIPaddress));
........
}

我感觉应该没问题
  • 打赏
  • 举报
回复
嗯,是 “InvokeRequired”。
  • 打赏
  • 举报
回复
记住使用控件的 requireinvoke 属性。

自己google吧!
兔子-顾问 2010-11-06
  • 打赏
  • 举报
回复
可能是你封装的问题。代码有点不完整。看不出关键问题。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧