如题,在主程序中创建了一个线程,该线程创建一个usercontrol,并将usercontrol显示在主程序窗体中。程序运行出现“当前线程不在单线程单元中,因此无法实例化 ActiveX 控件”的提示错误!寻求解决方案。usercontrol中引用的ActiveX控件是第三方的一个图形控件(mapcontrol)。有C#例子最好不过。初次接触,所以不懂。望指点迷津。

解决方案 »

  1.   

    主程序是否有加[STAThread]属性?
      

  2.   

    在窗体的主线程中写一个delegate就能解决这个问题。楼主的做法违反了线程安全的原则。
      

  3.   

    问3楼,如何写delegate,请出示例子。看是不是我需要的。
      

  4.   

    当然,如果自定义控件中如果没有ActiveX控件,是不会出错的。我的本意是要写一个全局函数GetPoint();在GetPoint里面等待图形控件的单击事件发生,从而获取单点点的坐标,GetPoint函数返回。所以带有图形控件的自定义控件必须要用一个线程来生成。因为GetPoint()函数会在主程序里面执行,如果图形控件不在一个新的线程中生成,根本不可能在GetPoint()执行的时候会有鼠标的操作。
      

  5.   

    在主窗体的类代码中:
    delegate void procCallBack(...);线程处理过程:
    private void procThread(...)
    {
      if(this.InvokeRequired)
      {
        procCallBack p = new procCallBack(...);
        this.Invoke(d, new object[]{...});
      }
      else
      {
        ......//子线程应处理的内容
      }
    }
      

  6.   

    这个应该是与COM组件交互引起的线程问题了.
      

  7.   

    加了【STAThread】属性好像也不行
      

  8.   

    学习了~~~,我以前也犯过这样的错,自己建了一个控制台程序,后面改为form程序就出现了这样的错,加了STAThread就解决了