unit ExecProcThreadUnit;interfaceuses
  Classes, forms,db,adodb;type
  TExecProcThread = class(TThread)
  private
    MyProc : TAdoStoredProc;
    { Private declarations }
  protected
    procedure Execute; override;
  public
    constructor Create(Suspended:Boolean;Proc:TAdoStoredProc);
end;
implementationconstructor TExecProcThread.Create(Suspended:Boolean;Proc:TAdoStoredProc);
begin
  inherited Create(false); {每次都是执行到这里出错,顺序调过也一样,错误信息:Debugger Exception NotificationProject Main.exe raised exception class EAccessViolation with message 'Access violation at address 00425F68 in module 'Main.exe'. Write of address 0000000E'. Process stopped. Use Step or Run to continue.}  MyProc:=Proc;
  FreeOnTerminate:=True;
end;procedure TExecProcThread.Execute;
begin
  MyProc.Open;
  { Place thread code here }
end;end.
很简单的线程吧?就是要出错。哪位指点一下?

解决方案 »

  1.   

    inherited Create(false); {每次都是执行到这里出错,顺序调过也一样,错误信息:
    当然出错了,这时候EXECUTE就执行代码了;所以你需要
    MyProc:=Proc;
     inherited Create(false);
      

  2.   

    inherited Create(false);
    这句的意思是创建一个线程,并且执行该线程,你看你的 Execute ,MyProc.Open,
    一开始执行线程,就要访问 Myproc,但是这时候你的 MyProc 还没有传递进来,
    是一个空的指针,当然要抱地址访问错了,你把你的构造函数改为:
    constructor TExecProcThread.Create(Suspended:Boolean;Proc:TAdoStoredProc);
    begin
      inherited Create(True); //创建一个线程,并挂起该线程
      MyProc:=Proc;
      FreeOnTerminate:=True;
      Suspended := False; //开始执行线程
    end;记得你传进来的 Proc 参数要在主线程里面先创建好。
      

  3.   

    不行哦,还是一样的错误。
    另外:Proc的参数都已经设好,加上线程后唯一的变化就是把.open换到了线程里面。
      

  4.   

    constructor TExecProcThread.Create(Suspended:Boolean;Proc:TAdoStoredProc);
    begin
      MyProc:=Proc;//运行到这里也出错。
      FreeOnTerminate:=True;
      inherited Create(True); 
      Suspended := False;
    end;就是说,只要进入到create()里面,第一条语句就会报错。