数据库中保存了多个单位服务器ip、数据库sid、password、database等字段,需要逐个探测各条记录保存的数据连接信息是否可连,若逐个测试耗费时间太长,所以我想用多线程来实现 
 
我是在一窗体的主程序中建立的线程,测试数据连结用的是adoconnection  unit U_ljqk;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls,  ImgList, RzGroupBar,
  Grids, DBGridEh, ExtCtrls,  RzListVw, RzCommon, RzButton, RzPanel,
  DB, ADODB, inifiles, Menus, CoolTrayIcon, Syncobjs;type
  Tf_ljqk = class(TForm)
。  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
Thrd  =  class(TThread)  
private  
       {  Private  declarations  }  
       FDBInfo:  string;  
       procedure  UpdateUI;        
protected  
   procedure  Execute;  override;  
         
public  
       constructor  Create(Suspended:  Boolean;  DBInfo:  string);  
end;  
 
var  
     f_ljqk:  Tf_ljqk;  
 
implementation  
 
{$R  *.dfm}  
 
constructor  Thrd.Create(Suspended:  Boolean;  DBInfo:  string);  
begin  
   FDBInfo  :=  DBInfo;  
end;  
 
procedure  Thrd.Execute;  
var  
   ADO:  TADOConnection;  
begin  
   self.FreeOnTerminate:=true;  
   ADO  :=  TADOConnection.Create(nil);  
   ADO.Connectionstring  :=  FDBInfo;  
   ado.CommandTimeout:=10;  
   ado.ConnectionTimeout:=5;
   ado.LoginPrompt:=false;  
   if  ADO.connected  then  
       Synchronize(UpdateUI)  
   {  Place  thread  code  here  }      
 
end;  
 
procedure  Thrd.UpdateUI;  
begin  
   f_ljqk.label1.caption  :=  '数库1成功';   
end;  
 
 
procedure  Tf_ljqk.FormCreate(Sender:  TObject);  
var  
   v_dbstr:  string;  
begin  
     with  adoquery1  do  
     begin  
         while  not  eof  do  
         begin  
             v_dbstr:='Provider=SQLOLEDB.1;Password='+trim(FieldByName('loadpwd').AsString)+';'+   'Persist  Security  Info=True;User  ID='+trim(FieldByName('loadid').AsString)+';Initial  Catalog=master'+';Data  Source='+trim(FieldByName('ip').AsString);  
           Thrd.Create(false,v_dbstr);  
           next;    
         end;  
     end;  
end;  
 
错误提示      ....THread  Error  :句柄无效(6).... 
我知道参数传递时有错误,但我不知道怎么改,哪位大侠能帮我改改吗 ,兄弟我感激不尽

解决方案 »

  1.   

    没必要重写线程的create方法procedure  Tf_ljqk.FormCreate(Sender:  TObject);  
    var  
       v_dbstr:  string;
       myThrd: ^Thrd;  
    begin  
         with  adoquery1  do  
         begin  
             while  not  eof  do  
             begin  
                 v_dbstr:='Provider=SQLOLEDB.1;Password='+trim(FieldByName('loadpwd').AsString)+';'+   'Persist  Security  Info=True;User  ID='+trim(FieldByName('loadid').AsString)+';Initial  Catalog=master'+';Data  Source='+trim(FieldByName('ip').AsString);  
                 new(myThrd);
                 myThrd^ := Thrd.Create(True);
                 myThrd^.FreeOnTerminate := True;
                 myThrd^.FDBInfo := v_dbstr;
                 myThrd^.Resume;
                 next;
                 .....
      

  2.   

    谢谢 erhan(二憨),按您的方法,我的问题解决了