跨线程、夸类访问主线程控件
程序是Windows程序,我要实现的效果是,当窗体运行的时候,开一个线程,
这个线程是定义在另外一个类里面,这个线程每隔1秒种更新主窗体上的label控件的值为当前的时间。
代码如下。请问如何实现。注意Form1窗体和线程ThreadProc是在不同的类中,
请高手帮忙。
namespace testThreadAndDelegate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
new Thread(new ThreadStart(new Thtest().ThreadProc)).Start();
}
}
class Thtest
{
public void ThreadProc()
{
Thread.Sleep(1000);
//更新Form1上面的Label的值。
Form1.Label1.Text=System.DateTime.now.tostring();
ThreadProc();
}
}
}
------解决方案--------------------
跨线程调用Winform控件:
1.在辅助线程调用(可通过delegate)下面的方法InvokeControl();
//写在主线程中(控件)
private void InvokeControl()
{
if (this.InvokeRequired)
this.Invoke(new DelegateChangeText(ChangeText));
else
this.ChangeText();
}
private void ChangeText()
{
this.TextBox.Text = "sd";
}
public delegate void DelegateChangeText();
2.在构造函数里使用属性
CheckForIllegalCrossThreadCalls 值设置为 false
即 public Form1()
{
CheckForIllegalCrossThreadCalls = false;
}
第二种可能不够安全~~
Wish you happy....
------解决方案--------------------
你可以在Thtest的构造方法加一个参数,将Form1的实例传进来。然后再Form1中加一个委托,最后在线程中调用该委托。
C# code
namespace testThreadAndDelegate
{
public partial class Form1 : Form
{
// 申明委托
public EventHandler<MyEventArgs> ChangeLabel;
public Form1()
{
InitializeComponent();
ChangeLabel = new EventHandler<MyEventArgs>(onChangeLabel); // 委托
}
// 委托方法
private void onChangeLabel(object sender, MyEventArgs e)
{
this.label1.Text = e.Text;
}
private void Form1_Load(object sender, EventArgs e)
{
new Thread(new ThreadStart(new Thtest(this).ThreadProc)).Start();
}
}
public class Thtest
{
private Form1 form;
public Thtest(Form1 form)
{
this.form = form;
}
public void ThreadProc()
{
Thread.Sleep(1000);
//更新Form1上面的Label的值。
//Form1.Label1.Text=System.DateTime.now.tostring();
// 调用委托
form.Invoke(form.ChangeLabel, new object[] { null, new MyEventArgs(System.DateTime.Now.ToString()) });
ThreadProc();
}
}
// 委托参数
public class MyEventArgs : EventArgs
{
private String text;
public MyEventArgs(String text)
{
this.text = text;
}
public String Text
{
get { return text; }
}
}
}