数据库中保存了多个单位服务器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;  
   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)+';pooling=false';  
           Thrd.Create(false,v_dbstr);  
           next;    
         end;  
     end;  
end;  
 
错误提示      ....THread  Error  :句柄无效(6).... 
我知道参数传递时有错误,但我不知道怎么改,哪位大侠能帮我改改吗 ,兄弟我感激不尽 

解决方案 »

  1.   

    问题解决了,现把主要代码贴出来,以供像我这样的菜鸟学习
    unit U_ljqk;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, Grids,  DB, ADODB, inifiles, Menus, Syncobjs, activex;type
      Tf_ljqk = class(TForm)
    。  private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    Thrd  =  class(TThread)  
    private  
           {  Private  declarations  }  
           FDBInfo:  string;  
           procedure  UpdateUI;   
           procedure  UpdateUX;      
    protected  
       procedure  Execute;  override;  
             
    public  
    end;  
     
    var  
         f_ljqk:  Tf_ljqk;  
     
    implementation  
     
    {$R  *.dfm}  
     procedure  Thrd.Execute;  
    var  
       ADO:  TADOConnection;  
    begin  
       self.FreeOnTerminate:=true; 
       CoInitialize(nil); 
       ADO  :=  TADOConnection.Create(nil);  
       ADO.Connectionstring  :=  FDBInfo;  
       ado.CommandTimeout:=10;  
       ado.ConnectionTimeout:=5;
       ado.LoginPrompt:=false;
       try
         ado.Open;
       except
         Synchronize(UpdateUX);
       end;  
       if  ADO.connected  then  
           Synchronize(UpdateUI) 
       else
       Synchronize(UpdateUX);
       ado.Free;
       CoUninitialize;   
     
    end;  
     
    procedure  Thrd.UpdateUI;  
    begin  
       f_ljqk.label1.caption  :=  '数库1成功';   
    end;  procedure  Thrd.UpdateUX;  
    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);  
                 new(myThrd);
                 myThrd^ := Thrd.Create(True);
                 myThrd^.FreeOnTerminate := True;
                 myThrd^.FDBInfo := v_dbstr;
                 myThrd^.Resume;  
               next;    
             end;  
         end;  
    end;