我是新手,程序中需要使用多线程。
在线程的
procedure TMyThread.Execute;
begin
  Synchronize(SetValue);
  ....
  .....
end;procedure TMyThread.SetValue;
begin
  str := MainForm.ComboBox1.Text;  
end;结果在 str := MainForm.ComboBox1.Text; 这句上报错,Access Violation at Address XXXXXXX应该怎么办呢?

解决方案 »

  1.   

    我照你的代码试了一遍,可以运行,我用的是Delphi7,我想知道
    str := MainForm.ComboBox1.Text;的上一句代码是什么。
      

  2.   

    多线程同时调用combobox是不是起冲突了?
      

  3.   

    似乎没有什么错,在其他地方找一下有没有错str,.comboBox,这些地方找一找
      

  4.   

    str 是什么类型,有处理吗?
      

  5.   

    楼主的错误我猜测应该和以下有关:你是否在MainForm的OnCreate事件里创建的线程?
    如果是那就问题所在:类似的 SomeObject := SomeClass.Create; 的语句中,在SomeClass.Create构造函数运行完成返回之前,SomeObject是无意义的,因为只有当类构造函数完成后才会执行赋值语句将已经建立的对象实例赋予变量; 而如果你在SomeClass构造期就引用SomeObject的话,实际上是一个无效对象指针。你在OnCreate中创建的线程在你意想不到的时刻运行到SetValue方法,此时主线程依然仍旧没有完成构造对象的赋值,所以你引用的MainForm是无效的,也是AV错误的根源。解决:将创建线程的代码转移到OnShow事件中,此时MainForm已经得到构造后的对象,你的代码可以正确运行。=====================当然,你的问题若非OnCreate的原因,那我所说的亦无所益处,请不要被我误导。。 :)
      

  6.   

    OnCreate,是在对象没有创建完成的时候发生的吗?????
      

  7.   

    是的,Delphi创建对象的流程是:1.为新对象分配堆内存
    2.执行对象的构造方法
    3.返回对象指针其中OnCreate事件的代码在第2步运行,如果构造函数出现异常,则回滚整个创建过程,收回分配的内存,不会造成内存泄漏。
      

  8.   

    oncreate 事件应该是窗体(包括上面的组件)完成构建才执行的