我在学习多线程时遇到以下问题,在当为某自定义类的实例建立新线程时,该线程调用的函数无法对主窗体中的控件进行赋值。
跪求各位高人指点...Class Form1   dim a as new mClass   Public sub btnA_Onclick(byval sender.....)  '点击按钮       dim t as new thread(addressof a.CallInvoke)
       t.start()   end sub  '完成点击按钮end ClassClass mClass
   public sub CallInvoke()       do while not form1.isHandleCreated       loop       form1.text1.beginInvoke(new EventHandle(Addressof SetForm1Property),"aaa")   end sub   public sub SetForm1Property(byval sender as object,byval e as ev....)
       
       form1.text1.test="aaa"   end subend class问题是:点击按钮后,为什么修改不了主窗体中text1.text的值。另外,若此句:
form1.text1.beginInvoke(new EventHandle(Addressof SetForm1Property),"aaa")前无
do while not form1.isHandleCreatedloop经常报错:“在创建窗口句柄之前,不能在控件上调用Invoke或BeginInvoke”

解决方案 »

  1.   

    VB 啊看代码有点费劲啊在创建窗口句柄之前,不能在控件上调用Invoke或BeginInvoke
    这个错误貌似你的窗体还没有调用CreateWindow或者正在CreateWindow之内,或没有调用showWindow()
    导致的。
      

  2.   

    我是主窗体已经出现后,再点击主窗体上的按钮,按道理主窗体已经创建了。
    用Msgbox(form1.handle)是不是显示主窗体的。
      

  3.   

    do while not form1.isHandleCreated
    这行出错么?
    如果是,也用invoke包一下来获取值。
      

  4.   

    public sub CallInvoke()
    此线程不是创建控件的主线程,不能调用的
      

  5.   

    不太熟悉VB
    请问:form1.text1.beginInvoke(),调用此方法的地方既不是当前UI线程,也不是UI类???
      

  6.   


    Class Form1   dim a as new mClass   Public sub btnA_Onclick(byval sender.....)  '点击按钮       dim t as new thread(addressof a.CallInvoke)
           t.start()     end sub  '完成点击按钮end ClassClass mClass
       dim mForm as form1
       public sub new(byval MainForm as form1)
           mform=mainForm
       end sub
       public sub CallInvoke()       do while not form1.isHandleCreated       loop       mform.beginInvoke(new EventHandle(Addressof SetForm1Property),"aaa")   end sub   public sub SetForm1Property(byval sender as object,byval e as ev....)
           
           form1.text1.test="aaa"   end subend class