服务器端程序:MDI主窗口中使用一个线程专门来接收来自客户端的消息,接收到消息后希望在子窗口的TEXTBOX上显示请问各位大侠有什么好的解决办法最好把代码也贴一下,多谢多谢

解决方案 »

  1.   

    有关子线程如何访问windows控件,参考下面李子中委托的用法
    http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx
      

  2.   

    有两种方法:
    第一种:从vs.net2003中继承下来的:
    加一句:就可以直接用多线程访问控件了:
    System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false; 
      

  3.   

    Form mainForm;//主窗体
    TextBox tbResult;//子窗体中的控件名
    mainForm.MdiChildren[x].tbResult="";
      

  4.   

    《.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
      

  5.   

    另外一种:
    用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();
            }
      

  6.   

    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;
            }
      

  7.   

    设断点后跟踪发现:aa:Text=由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值