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.
很简单的线程吧?就是要出错。哪位指点一下?
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.
很简单的线程吧?就是要出错。哪位指点一下?
当然出错了,这时候EXECUTE就执行代码了;所以你需要
MyProc:=Proc;
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 参数要在主线程里面先创建好。
另外:Proc的参数都已经设好,加上线程后唯一的变化就是把.open换到了线程里面。
begin
MyProc:=Proc;//运行到这里也出错。
FreeOnTerminate:=True;
inherited Create(True);
Suspended := False;
end;就是说,只要进入到create()里面,第一条语句就会报错。