求助-急
我想在子线程接收服务器发送的信息然后在父线程创建窗体上画控件
直接画会有错误
尝试过定义一个事件,用子线程触发事件,调用画控件的方法,不好用
应该怎么弄啊

解决方案 »

  1.   

    子线呈访问界面线呈需要使用   begininvoke方法。
      

  2.   

    可以用向界面发送消息的方式实现
    SendMessage, PostMessage
      

  3.   


    用事件可以实现。我做过。
    这样弄:你把事件单独写个类,CEvent.cs
    我的培训例程
    class CEvent
    {
     #region 显示像素点坐标
            public delegate void PixelPosition(int x, int y);
            public static event PixelPosition eventPixelPos;        public static void invokePixelPos(int x, int y)
            {
                eventPixelPos(x, y);
            }
            #endregion
    }
    在窗体的load中事件注册:
    CEvent。eventPixelPos += new CEvent。eventPixelPos(showPixelPos);private void showPixelPos(int x, int y)
    {
    //do something;
    }在某个子线程中,如果想调用的话,
    CEvent。invokePixelPos(x,y);你试一下。
      

  4.   

    线程内部调用的函数 是 UI 控件或窗口类的函数, 
    这时, 可以这样做, 有助于理解知识:
      void threadfucntion()
      {
          // 拿到将要调用的代理示例
          EventHandler d = _events[o] as EventHandler;
          if (d == null)
            return;
          // 看看代理对应的函数所在的对象是否实现 ISynchronizeInvoke
          // Winform 中 Control 实现了她, 因此所有控件都实现了
          // 这个接口正是用于跨线程调用的
          if (d.Target != null && d.Target is ISynchronizeInvoke)
          {
            // 如果是 control 子类, 则拿到接口
            ISynchronizeInvoke isi = d.Target as ISynchronizeInvoke;
            // 询问一下控件是否需要 marshal 调用
            // Control 是如何判断的, 可以看看 Control 的代码, 总之, Control 自己会知道是否需要 marshal
            if (isi.InvokeRequired)
              // marshal 调用
              isi.Invoke(d, new object[] { this, EventArgs.Empty });
            else
              // 不需要, 说明调用代码跟响应代码在同一线程中
              d(this, EventArgs.Empty);
          }
          else
            // 如果函数所在类对象没有实现 ISynchronizeInvoke, 则直接调用
            d(this, EventArgs.Empty);
      }