我是新手,程序中需要使用多线程。
在线程的
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应该怎么办呢?
在线程的
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应该怎么办呢?
str := MainForm.ComboBox1.Text;的上一句代码是什么。
如果是那就问题所在:类似的 SomeObject := SomeClass.Create; 的语句中,在SomeClass.Create构造函数运行完成返回之前,SomeObject是无意义的,因为只有当类构造函数完成后才会执行赋值语句将已经建立的对象实例赋予变量; 而如果你在SomeClass构造期就引用SomeObject的话,实际上是一个无效对象指针。你在OnCreate中创建的线程在你意想不到的时刻运行到SetValue方法,此时主线程依然仍旧没有完成构造对象的赋值,所以你引用的MainForm是无效的,也是AV错误的根源。解决:将创建线程的代码转移到OnShow事件中,此时MainForm已经得到构造后的对象,你的代码可以正确运行。=====================当然,你的问题若非OnCreate的原因,那我所说的亦无所益处,请不要被我误导。。 :)
2.执行对象的构造方法
3.返回对象指针其中OnCreate事件的代码在第2步运行,如果构造函数出现异常,则回滚整个创建过程,收回分配的内存,不会造成内存泄漏。