多线程操作FORM控件的问题
我用C#写的WINDOW FORM的应用程序,其中使用了多个线程,由于线程的逻辑比较复杂,我使用了类来封装这些逻辑代码,然后调用,这其中我遇到了几个疑惑的问题,请教各位,谢谢,我在写这个程序之前从来没用过C#,而用MFC。
1、我在FORM1.CS的类里建立了几个PUBLIC的函数,我在线程类中怎样调用到这些函数?总不能去NEW FORM1()吧?也不能建立一个STATIC的函数啊?
2、其次在线程类的代码中怎样给FORM中的控件赋值或者获取属性?由于无法访问到FORM.CS中的函数,自然也无法获取到控件的类了,很疑惑这个问题,难道真的要每次都要将这个控件传递给类的构造函数?
3、我在多个线程中都要对FORM的控件进行操作,怎样避免同时访问的问题?在C#中没有LOCK的功能?
------解决方案--------------------使用委托:
主线程:
第一步:定义委托delegate
private delegate void setConn(string strConn);
private setConn mySetConn = null;
第二步:定义一个方法
private void DispText(string strConn)
{
textBox1.Text = strConn;
}
第三步:初始化委托
mySetConn = new setConn(this.DispText);
第四步:在工作线程中
this.Invoke(mySetConn, "把我显示在textBox1中,谢谢! ");
------解决方案--------------------TO:其次在线程类的代码中怎样给FORM中的控件赋值或者获取属性?
楼上几位也提到了,用Invoke..
举个例子,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
类似:
using System.Threading;
//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//线程方法
private void DoWork()
{
//其他操作
//比如将界面的TextBox内容设置一下
this.TextBox1.Text= "我是一个文本框 ";
}
如果你像上面操作,在VS2005里是会有异常的...
正确的做法是用Invoke..
改为如下:
//定义一个委托
public delegate void MyInvoke(string str);
//更新界面的方法
private void UpdateTextBox(string str);
{
//更新
this.TextBox1.Text=str;
}
//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//线程方法
private void DoWork()
{
//其他操作
//比如将界面的TextBox内容设置一下
MyInvoke mi=new MyInvoke(UpdateTextBox);
this.BeginInvoke(mi,new object[]{ "我是一个文本框 "});
}
------解决方案--------------------TO:我在多个线程中都要对FORM的控件进行操作,怎样避免同时访问的问题?在C#中没有LOCK的功能?
当然有,MFC中有的,C#中基本上都有...
我最常用的是互斥量,即Mutex...
举个例子..
比如一段代码(或者某个共享资源),线程都有可能会调用,那如何来对其互斥访问呢,即某个时间点只允许一个线程对其进行操作?
//先实例化Mutex
private Mutex mx=new Mutex();
....
//在需要互斥访问的地方这样来用..
mx.WaitOne();
//需要互斥访问的代码(或者资源)
mx.ReleaseMutex();
------解决方案--------------------TO:TO:我在多个线程中都要对FORM的控件进行操作,怎样避免同时访问的问题?在C#中没有LOCK的功能?
对于这个问题,你当然也可以用Lock..
for example:
public void Function()
{
System.Object lockThis = new System.Object();
lock(lockThis)
{
// Access thread-sensitive resources.
}
}