跨线程、夸类访问主线程控件
程序是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中加一个委托,最后在线程中调用该委托。
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; } } }}