type
  TThr = class(TThread)
  private
   times : TTime;
   mysql : String;
   rs : TADOQuery;
    { Private declarations }
  protected
    procedure Execute; override;
  public
    constructor create(qry: TADOQuery);
  end;procedure TForm1.Button1Click(Sender: TObject);
var Th1 : TThr;
begin
  Th1 := TThr.Create(qry);
end;////执行到这里报的错,create过程里没报错constructor TThr.create(qry: TADOQuery);
begin
  rs := qry;
  FreeOnTerminate:=true;
  inherited create(false);
end;qry 是我在窗体上放的一个adoquery控件,我想把它传到线程里面,结果出错了。
abstrace error错误

解决方案 »

  1.   

    procedure Execute; override;怎么没有实现???
    错误提示是用了一个抽象方法吧。。
    好好检查以下。
      

  2.   

    因为还没执行到Execute,所以我没贴,请大家帮看看怎么回事?
      

  3.   

    是这样的,你的constrcutor没有问题的,关键还是在你的execute里边出错的,因为你的Thread一但create后就会调用Excute的方法,与主进程无关了。所以你还是要贴出excute函数的代码。
      

  4.   

    procedure TThr.Execute;
    var i : Integer;
    begin
      inherited;
    //  rs := TADOQuery.Create(Application);
    //  rs.Connection := adoconnection;
      for i:=1 to 10000 do
      begin
        times := time;
        with rs do
        begin
          Close;
          SQL.Clear;
          mysql := 'insert into temp(mydata,mytime) values("'+inttostr(i)+'","'
            +TimeToStr(times)+'")';
          SQL.Add(mysql);
          ExecSQL;
        end;
      end;
    end;
      

  5.   

    project project1.exe raised exception class eabstracterror with message 'abstract error'.process stopped. use step or continue.
      

  6.   

    TADOQuery是封装的ADO,根据COM规范,你不能这样简单的传个指针进另一个线程的。跨线程(按COM确切来说,是跨套间)的传接口必须Marshal方式。。正好最近也有讨论类似问题的贴子。http://expert.csdn.net/Expert/topic/2516/2516319.xml?temp=.7895319
    http://expert.csdn.net/Expert/topic/2670/2670199.xml?temp=.7523615
    http://expert.csdn.net/Expert/topic/2627/2627962.xml?temp=.7618982