线程中访问MDI子窗口控件,请大侠指教,在线等 服务器端程序:MDI主窗口中使用一个线程专门来接收来自客户端的消息,接收到消息后希望在子窗口的TEXTBOX上显示请问各位大侠有什么好的解决办法最好把代码也贴一下,多谢多谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有关子线程如何访问windows控件,参考下面李子中委托的用法http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx 有两种方法:第一种:从vs.net2003中继承下来的:加一句:就可以直接用多线程访问控件了:System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false; Form mainForm;//主窗体TextBox tbResult;//子窗体中的控件名mainForm.MdiChildren[x].tbResult=""; 《.net 2.0 BackgroundWorker类详细用法》在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。 http://blog.csdn.net/zhoufoxcn/archive/2007/10/19/1832819.aspx 另外一种:用InvokeRequired属性和委托,示例代码如下:Thread threadCard = null;public delegate void SetCardInfoHandler(string cardNo);public void SetCardInfo(string cardNo){ if (teCard.InvokeRequired) { SetCardInfoHandler set = new SetCardInfoHandler(SetCardInfo); teCard.Invoke(set, new object[] { cardNo }); } else { teCard.Text = cardNo; } }private void FrmCardRead_Load(object sender, EventArgs e) { lcMsg.Text = "信息提示:讀卡狀態中,請刷卡......"; threadCard = new Thread(new ThreadStart(ReadCard)); threadCard.Start(); } to jinjazz :我已经使用委托方式来访问子窗口控件,但没有结果也不报错,代码如下:public static ChatServer aa = null; private void recvThread() { try { aa = new ChatServer(); recvSock = sock.Accept(); if (recvSock.Connected == true) { while (true) { byte[] recvByte = new byte[255]; int i = recvSock.Receive(recvByte, recvByte.Length, 0); if (i > 0) { string data = System.Text.Encoding.ASCII.GetString(recvByte, 0, recvByte.Length); this.SetText(aa.logText, data); ///消息展示在子窗口控件中,aa为子窗口,logText是公共属性,用委托方式 } } } } catch (System.Net.Sockets.SocketException e) { MessageBox.Show(e.ToString()); } } private void SetText(TextBox lb, string text) { if (lb.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { lb, text }); } else lb.Text = text; } 设断点后跟踪发现:aa:Text=由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值 关于窗体继承的内部实现. 如何从一个类 读写窗体的控件 RDLC报 值不在预期的范围内 错误. 多进程的编程的问题 求助,,急。。。 C#中如何根据变量值获得其所属的枚举类型? 抽签! 抽签! 算法 C#和C++相互中傳遞數組的問題 select 语句的别名问题? 可以把DataGrid控件最左边的换成改成一个Button么? 跪求c#的system.net和system.net.socket的学习资料 大家一起学习Composite UI Application Block! 强烈要求增加一个Smart Client或者CAB的板块
http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx
第一种:从vs.net2003中继承下来的:
加一句:就可以直接用多线程访问控件了:
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;
TextBox tbResult;//子窗体中的控件名
mainForm.MdiChildren[x].tbResult="";
在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
http://blog.csdn.net/zhoufoxcn/archive/2007/10/19/1832819.aspx
用InvokeRequired属性和委托,示例代码如下:Thread threadCard = null;
public delegate void SetCardInfoHandler(string cardNo);public void SetCardInfo(string cardNo)
{
if (teCard.InvokeRequired)
{
SetCardInfoHandler set = new SetCardInfoHandler(SetCardInfo);
teCard.Invoke(set, new object[] { cardNo });
}
else
{
teCard.Text = cardNo;
}
}private void FrmCardRead_Load(object sender, EventArgs e)
{
lcMsg.Text = "信息提示:讀卡狀態中,請刷卡......";
threadCard = new Thread(new ThreadStart(ReadCard));
threadCard.Start();
}
{
try
{
aa = new ChatServer();
recvSock = sock.Accept();
if (recvSock.Connected == true)
{
while (true)
{
byte[] recvByte = new byte[255];
int i = recvSock.Receive(recvByte, recvByte.Length, 0);
if (i > 0)
{
string data = System.Text.Encoding.ASCII.GetString(recvByte, 0, recvByte.Length);
this.SetText(aa.logText, data); ///消息展示在子窗口控件中,aa为子窗口,logText是公共属性,用委托方式
}
}
}
}
catch (System.Net.Sockets.SocketException e)
{
MessageBox.Show(e.ToString());
}
}
private void SetText(TextBox lb, string text)
{
if (lb.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { lb, text });
}
else
lb.Text = text;
}