类中的线程要如何正确访问窗体控件 class A有个方法private funB()及线程函数funC();funB()开启一个线程,线程执行线程函数new ThreadStart(funC);funC()中要修改窗体FRM中的一个控件的值.如何实现呢?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //定义一个委托public delegate void MyInvoke(string str);//更新界面的函数private void updateUI(string str){ //比如设置Label的值 this.Label1.text=str;}//线程回调函数private void funC(){ string str="youValue"; //更新界面 MyInvoke mi=new MyInvoke(updateUI); this.BeginInvoke(mi,new object[]{str});} //线程回调函数private void funC(){ string str="youValue"; //更新界面 MyInvoke mi=new MyInvoke(updateUI); //你这个this指的是啥东西?funC()不在窗体FRM类里定义的呀.FunC()是类A的一个线程函数.你这this.后面出不了BeginInvoke()吧...类A是自定义类.... this.BeginInvoke(mi,new object[]{str});} this是指当前窗体,不好意思,我以为你的线程是在Form里的...你是想实现什么?窗体类中新建一个A的对象,然后再通过A来更新窗体? 是的,本意就是为了通过A来更新窗体...不过感觉起来又怪怪的...如果我的线程函数不定义在类A里而是定义在窗体类里就好办了吧?但是线程一定是在A里开启的..那如何把窗体类中的线程函数传过来给类A呢??也就是说FRM:ThreadFun() 如果出现在A:new Thread(new ThreadStart(这里))中.... 代码大概是这样的;Form:OnFormLoad(){ //窗体控件timer timer.start(); //类A实例调用 AInstance.publicFun();}//类A的publicFun()A:publicFun(){ //开启线程. threadA = new Thread(new Threadstart(threadFun));}//在类A中的线程函数A:threadFun(){ //修改窗体的timer令其stop();就是这里不知道要如何去修改,或者我这样的编程本来就不对了.请高手指点... timer.stop();} 这其实像是一种传递函数指针的意思呀.只不过我学C#不久.对.NET的理解又太浅.有没有人指点下.如何传递函数的指针... 总之在UI线程之外的线程想要访问UI相关的资源,都必须通过Control.Invoke。 我是这样设计程序的,为了实现多线程通讯的自封装类.定义SockManage提供ConnectTo()公有方法,调用此方法启动一个线程并连接.但是此线程的连接信息必需回馈给界面.如SocketException的异常"由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败。"且在连接期间保持动态更新界面进度条显示当前正在进行连接的状态.这将导致一个问题,当我把线程函数放在自定义类SockManage中实现时无法访问窗体控件,因为我不知道要如何去访问.因此我目前只能 在你的封装类中写个public 的event,比如match,当匹配到就即使通知界面更新private void OnMatch(string name) { lock(this) { FireAsync(Match, name); } }protected void FireAsync(Delegate dlg, params object[] pList) { if (dlg != null) { Target.BeginInvoke(dlg, pList); } } 这将导致一个问题,当我把线程函数放在自定义类SockManage中实现时无法访问窗体控件,因为我不知道要如何去访问.因此我目前只能将线程函数放于窗体类中,当实例化SockManage时,将窗体线程函数的指针传给SockManage的线程启动函数.这样虽然实现了动态更新界面和出错信息的反馈,但却体现不出封装的效果.代码大概如下://全局代理,即线程函数的代理.public delegage void ConnectHelper();//窗体加载时.Form:Load(){ SockManage Comm = new SockManage(); Comm.DoConnect += new ConnectHelper(ConnectCallBack); Comm.ConnectTo();}Form:ConnectCallback(){ //在这里通过BeginInvoke()可修改界面控件.但是...又没了封闭的效果... try { //我已经Socket与EndPoint等定义在SockManage中,但现在又必需把他们用public暴露 出来,因为我的线程函数都成了窗体的成员函数了. Comm.Socket.Connect(Comm.IPEndPoint) }}SockManage:ConnectTo(){ //其中DoConnect在类SockManage中定义为:public event ConnectHelper Doconnect; Thread t = new Thread(new ThreadStart(DoConnect));}//但如果是把ConnectCallback()定义于SockManage中如下:SockManage:ConnectCallback(){ //在这里访问Socket,EndPoint就很好了.但又不能通过BeginInvoke去访问窗体控件,请问我应该如何去实现多线程的封装,又可动态更新窗体.如果有朋友有这方面的代码请发到我的EMAIL:[email protected]谢谢了...} 使用Control.Invoke或Control.BeginInvoke来更新UI上的控件。http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspxhttp://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx IDataObject应用 求帮忙,动态绑定拼出来的HTML数据,为啥不刷新,用户体验较好?? 关于listbox 802.11n无线网络编程用什么,Socket行吗 请问winfrom里的常用控件有哪写 ##100高分求解###为何用文本形式快速导出的EXCEL导入时会提示"外部表不是预期格式数据库打开失败"?如何解决? 多线程同步问题 数据读取的一个问题! 一个困惑的简单问题,大家来看看啊!!!!!!!!!! 急!!请教线程通信postthreadmessage问题~ 求datareader的例子 一个简单的查询问题?
public delegate void MyInvoke(string str);
//更新界面的函数
private void updateUI(string str)
{
//比如设置Label的值
this.Label1.text=str;
}//线程回调函数
private void funC()
{
string str="youValue";
//更新界面
MyInvoke mi=new MyInvoke(updateUI);
this.BeginInvoke(mi,new object[]{str});
}
private void funC()
{
string str="youValue";
//更新界面
MyInvoke mi=new MyInvoke(updateUI); //你这个this指的是啥东西?funC()不在窗体FRM类里定义的呀.FunC()是类A的一个线程函数.你这this.后面出不了BeginInvoke()吧...类A是自定义类....
this.BeginInvoke(mi,new object[]{str});
}
Form:OnFormLoad()
{
//窗体控件timer
timer.start();
//类A实例调用
AInstance.publicFun();
}//类A的publicFun()
A:publicFun()
{
//开启线程.
threadA = new Thread(new Threadstart(threadFun));
}//在类A中的线程函数
A:threadFun()
{
//修改窗体的timer令其stop();就是这里不知道要如何去修改,或者我这样的编程本来就不对了.请高手指点...
timer.stop();
}
private void OnMatch(string name)
{
lock(this)
{
FireAsync(Match, name);
}
}protected void FireAsync(Delegate dlg, params object[] pList)
{
if (dlg != null)
{
Target.BeginInvoke(dlg, pList);
}
}
public delegage void ConnectHelper();
//窗体加载时.
Form:Load()
{
SockManage Comm = new SockManage();
Comm.DoConnect += new ConnectHelper(ConnectCallBack);
Comm.ConnectTo();
}
Form:ConnectCallback()
{
//在这里通过BeginInvoke()可修改界面控件.但是...又没了封闭的效果...
try
{
//我已经Socket与EndPoint等定义在SockManage中,但现在又必需把他们用public暴露 出来,因为我的线程函数都成了窗体的成员函数了.
Comm.Socket.Connect(Comm.IPEndPoint)
}
}
SockManage:ConnectTo()
{
//其中DoConnect在类SockManage中定义为:public event ConnectHelper Doconnect;
Thread t = new Thread(new ThreadStart(DoConnect));
}//但如果是把ConnectCallback()定义于SockManage中如下:
SockManage:ConnectCallback()
{
//在这里访问Socket,EndPoint就很好了.但又不能通过BeginInvoke去访问窗体控件,请问我应该如何去实现多线程的封装,又可动态更新窗体.如果有朋友有这方面的代码请发到我的EMAIL:
[email protected]谢谢了...
}
Control.Invoke或Control.BeginInvoke来更新UI上的控件。
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx