日期:2014-05-18  浏览次数:20786 次

跨线程、夸类访问主线程控件
程序是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; }
        }
    }
}