procedure digthread.fconndb; var i:integer; begin if not dbm.con.Connected then begin for i:=1 to 3 do begin hint('尝试第'+inttostr(i)+'次连接...');//已经同步了 if dbm.con.Connected then break; try dbm.con.Open;//到这里就不动了 finally ; end; end; if dbm.con.Connected then hint('数据库连接成功') else hint('数据库连接失败'); end; end;
end;destructor QueryThread.Destroy; begin FAdoQuery.FREE; FAdoQUserInfor.FREE; Fadoconnection.Free; strlist.Free; iplist.free; CoUnInitialize;//必须使用 inherited destroy; end;procedure QueryThread.Execute; begintry begin extractinfor(FComputerInfor); //进行信息提取 Synchronize(ShellexeQuery);// end; exceptself.Terminate;end;end;procedure QueryThread.ExtractInfor(TransInfo: string);//改过程进行提取用#进行分割//的串里的各个字符串integer; j:array [1..2]of integer;//用来保存分割符的位置 H,L,M,N:integer;//进行组合字符串时的循环参数begin全局变量,首先清空 ExtractDomainUser:=''; ExtractDomainname:=''; ExtractComputername:=''; H:=1;//================================= try begin for i := 1 to length(TransInfo) do if TransInfo[i]='#' then //找到了 begin j[H]:=i;
inc(H); continue; //跳出循环 end; BEGIN for L:=1 to j[1]-1 do ExtractDomainUser:=ExtractDomainUser+TransInfo[L]; //提取的登陆域用户名 ://showmessage(extractdomainuser); for M:=j[1]+1 to j[2]-1 do ExtractDomainname:=ExtractDomainname+TransInfo[M];//提取的域控制器名 //showmessage(extractdomainname); for N:=j[2]+1 to length(trim(TransInfo)) do ExtractComputername:=ExtractComputername+Transinfo[N];//提取的计算机名 //showmessage(extractcomputername); END; end;//进行异常处理 Except // messagebox(0,'信息提取出现错误!','提示信息',mb_iconinformation); end; end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
线程的.AdoQuery := Form1.AdoQuery;我的这样实现了
数据模块里放了一个adoconnection组件可是在线程里open时,不能再执行下去。可在线程处手动创建一个数据模块,然后open时,能返回的。
var i:integer;
begin
if not dbm.con.Connected then
begin
for i:=1 to 3 do
begin
hint('尝试第'+inttostr(i)+'次连接...');//已经同步了
if dbm.con.Connected then break;
try
dbm.con.Open;//到这里就不动了
finally
;
end;
end;
if dbm.con.Connected then
hint('数据库连接成功')
else
hint('数据库连接失败');
end;
end;
[email protected]
windows,SysUtils,Classes, Dialogs,ADODB,db, NMMSG, ActiveX{必须要有};type
QueryThread = class(TThread)
private
FComputerInfor,FIPaddressinfo: string; //传递的信息
FAdoQuery,FAdoQUserInfor:TadoQuery; //动态生成的表一,表2
Fadoconnection:Tadoconnection; //动态生成的连接
Fnmmsg,FNMretureMSG:TNMMSG;//用来发送返回信息的组件
filestream:tfilestream;
procedure ExtractInfor(TransInfo:string{自定义的从该提交信息中分离信息的过程});
procedure ShellexeQuery;
Destructor Destroy; protected
procedure Execute; override;
public
constructor create(ComputerInfor:string;{传输来的计算机信息}IPaddressinfo:string{传输来的IP地址信息};nmmsg,NMretureMSG:TNMMSG);
end;
var
ExtractDomainUser:string; //提取出来的域用户名
ExtractComputername:string;//提取出来的计算机名称
ExtractDomainname:string;//提取出来的域名
strlist:Tstringlist;
IPlist:Tstringlist;//保存查找到的本工作组的ip地址信息
const defeat='defeat'; //验证失败,必须注销客户机,在数据库中重新进行写入
uses Unitsendthread;
constructor QueryThread.create(ComputerInfor, IPaddressinfo: string;nmmsg,NMretureMSG:TNMMSG);
begin
CoInitialize( nil );//使用com对象必须要初始化
inherited create(false);
FreeOnTerminate:=true;
FComputerInfor:=ComputerInfor;
FIPaddressinfo:=IPaddressinfo;
IPlist:=Tstringlist.create;//创造ip列表
FAdoQuery:=TAdoQuery.Create(nil); //动态生成表一
FAdoQUserInfor:=TadoQuery.Create(nil);//动态生成表2
Fadoconnection:=Tadoconnection.Create(nil);//动态生成的连接
Fadoconnection.LoginPrompt :=false;
Fadoconnection.KeepConnection :=true;
Fadoquery.Connection:=Fadoconnection;
FAdoQUserInfor.Connection :=Fadoconnection;
Fadoconnection.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=PersonInformation.mdb;Mode=Read;Persist Security Info=False';
Fnmmsg:=nmmsg;
FNMretureMSG:=NMretureMSG;
strlist:=Tstringlist.Create;
end;destructor QueryThread.Destroy;
begin
FAdoQuery.FREE;
FAdoQUserInfor.FREE;
Fadoconnection.Free;
strlist.Free;
iplist.free;
CoUnInitialize;//必须使用
inherited destroy;
end;procedure QueryThread.Execute;
begintry
begin
extractinfor(FComputerInfor); //进行信息提取
Synchronize(ShellexeQuery);//
end;
exceptself.Terminate;end;end;procedure QueryThread.ExtractInfor(TransInfo: string);//改过程进行提取用#进行分割//的串里的各个字符串integer;
j:array [1..2]of integer;//用来保存分割符的位置
H,L,M,N:integer;//进行组合字符串时的循环参数begin全局变量,首先清空
ExtractDomainUser:='';
ExtractDomainname:='';
ExtractComputername:='';
H:=1;//=================================
try
begin
for i := 1 to length(TransInfo) do if TransInfo[i]='#' then //找到了
begin
j[H]:=i;
inc(H);
continue; //跳出循环
end; BEGIN
for L:=1 to j[1]-1 do
ExtractDomainUser:=ExtractDomainUser+TransInfo[L]; //提取的登陆域用户名
://showmessage(extractdomainuser);
for M:=j[1]+1 to j[2]-1 do
ExtractDomainname:=ExtractDomainname+TransInfo[M];//提取的域控制器名
//showmessage(extractdomainname);
for N:=j[2]+1 to length(trim(TransInfo)) do
ExtractComputername:=ExtractComputername+Transinfo[N];//提取的计算机名
//showmessage(extractcomputername);
END;
end;//进行异常处理
Except
// messagebox(0,'信息提取出现错误!','提示信息',mb_iconinformation);
end;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////