delphi多线程查询多个数据库数据,可以同时运行的多线程数目?
时间:2011-08-26
来源:互联网
通过config文件中的IP地址,去查询各IP电脑中的数据库数据,各电脑数据库用户名和密码是相同的。我创建多线程同时查询各数据库中的数据,当查询10个以内的数据库时,程序正常,但当查询多余十个数据库时,程序就死掉了。小弟本人水平有限,求高手帮忙。下面是程序代码。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
Dialogs, StdCtrls, IniFiles, Grids, DBXpress, DB,ActiveX,
ComObj, Math, SqlExpr, ADODB;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid; //查询数据显示框
Button1: TButton; //多线程数据库查询按钮
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
{数据库IP以及查询数据变量}
BjServer:string;
BjZkjbzl, BjZkxmzh, BjSxz, BjZtry: Integer;
DjLst: TStringList; //数据库IPList
ThreadsRunning: Integer; //线程计数变量
procedure ThreadDone(Sender: TObject);
public
{ Public declarations }
{多个数据库连接控件--动态创建 }
UnADOConnection: TADOConnection;
UnADOQuery: TADOQuery;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Unit2;
procedure TForm1.FormCreate(Sender: TObject);
var
DjIni: TIniFile;
I: Integer;
begin
//从config.ini中读取数据库IP地址
DjIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
DjLst := TStringList.Create;
BjServer:=DjIni.ReadString('BJMainServer','IP','');
DjIni.ReadSection('DjServer', DjLst);
StringGrid1.RowCount := DjLst.Count;//动态增加行
for I := 0 to DjLst.Count do
StringGrid1.Cells[0, I] := DjIni.ReadString('DjServer', DjLst.Strings[I-1], '');
//创建的线程数目
ThreadsRunning := DjLst.Count;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
IpString:string;
begin
for i := 2 to DjLst.Count+1 do
begin
UnADOConnection:=TADOConnection.Create(nil);
UnADOConnection.Close; UnADOConnection.ConnectionString := 'Provider=MSDAORA.1;Data Source='+ IPString +';Persist Security Info=True';
UnADOConnection.LoginPrompt := False;
try
UnADOConnection.Open('user', 'password');
except
StringGrid1.Cells[5, i] := '数据打开失败';
UnADOConnection.Free;
raise;
Continue;
end;
//动态创建数据库连接组件
UnADOQuery:=TADOQuery.Create(nil);
UnADOQuery.Connection:= UnADOConnection;
//创建线程
with QueryThread.Create(i, UnADOConnection, UnADOQuery) do
OnTerminate := ThreadDone;
end;
end;
//线程结束处理函数
procedure TForm1.ThreadDone(Sender: TObject);
begin
Dec(ThreadsRunning);
if ThreadsRunning = 0 then //判断线程是否都已经结束
begin
ShowMessage('查询完毕');
end;
end;
end.
查询线程代码如下:
unit Unit2;
interface
uses
Classes, Windows, SyncObjs, SysUtils, SqlExpr, Forms, ADODB, DB,Variants, StdCtrls, ExtCtrls, FMTBcd;
type
QueryThread = class(TThread)
private
{ Private declarations }
FADOConnection: TADOConnection; { 与查询组件相关的数据感知组件 }
FADOQuery: TADOQuery; { 线程中的查询组件 }
FIntRow:Integer;
protected
procedure Execute; override;
public
constructor Create(introw:Integer; Connection:TADOConnection;Query:TADOQuery);
end;
implementation
uses
Unit1;
{ QueryThread }
{ 线程查询类的构造器 }
constructor QueryThread.Create(introw:Integer; Connection:TADOConnection;Query:TADOQuery);
//线程的构造函数,执行初始化工作
begin
FIntRow:=introw;
FADOConnection:= Connection;
FADOQuery:= Query;
FreeOnTerminate := True; {让线程执行完毕后随即释放}
inherited Create(False);
end;
procedure QueryThread.Execute;
begin
AConnection.Connected:=True;
Query.Close;
Query.SQL.Clear;
//数据库查询
//查询zkxmzh
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('select count(rowid) from bj_yw_t_zkxmzh');
Query.Open;
Form1.StringGrid1.Cells[1, introw] := IntToStr(Query.Fields[0].AsInteger);
//查询ztry
Query.Close;
Query.SQL.Clear;
Query.SQL.Text:= 'select count(rowid) from bj_yw_t_ztry';
Query.Open;
Form1.StringGrid1.Cells[2, introw] := IntToStr(Query.Fields[0].AsInteger);
//查询sxz
Query.Close;
Query.SQL.Clear;
Query.SQL.Text:= 'select count(rowid) from bj_yw_t_sxz';
Query.Open;
Form1.StringGrid1.Cells[3, introw] := IntToStr(Query.Fields[0].AsInteger);
application.ProcessMessages;//同步显示
AConnection.Connected:=False;
AConnection.Close;
Form1.StringGrid1.Cells[4, introw] := '连接成功';
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
Dialogs, StdCtrls, IniFiles, Grids, DBXpress, DB,ActiveX,
ComObj, Math, SqlExpr, ADODB;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid; //查询数据显示框
Button1: TButton; //多线程数据库查询按钮
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
{数据库IP以及查询数据变量}
BjServer:string;
BjZkjbzl, BjZkxmzh, BjSxz, BjZtry: Integer;
DjLst: TStringList; //数据库IPList
ThreadsRunning: Integer; //线程计数变量
procedure ThreadDone(Sender: TObject);
public
{ Public declarations }
{多个数据库连接控件--动态创建 }
UnADOConnection: TADOConnection;
UnADOQuery: TADOQuery;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Unit2;
procedure TForm1.FormCreate(Sender: TObject);
var
DjIni: TIniFile;
I: Integer;
begin
//从config.ini中读取数据库IP地址
DjIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
DjLst := TStringList.Create;
BjServer:=DjIni.ReadString('BJMainServer','IP','');
DjIni.ReadSection('DjServer', DjLst);
StringGrid1.RowCount := DjLst.Count;//动态增加行
for I := 0 to DjLst.Count do
StringGrid1.Cells[0, I] := DjIni.ReadString('DjServer', DjLst.Strings[I-1], '');
//创建的线程数目
ThreadsRunning := DjLst.Count;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
IpString:string;
begin
for i := 2 to DjLst.Count+1 do
begin
UnADOConnection:=TADOConnection.Create(nil);
UnADOConnection.Close; UnADOConnection.ConnectionString := 'Provider=MSDAORA.1;Data Source='+ IPString +';Persist Security Info=True';
UnADOConnection.LoginPrompt := False;
try
UnADOConnection.Open('user', 'password');
except
StringGrid1.Cells[5, i] := '数据打开失败';
UnADOConnection.Free;
raise;
Continue;
end;
//动态创建数据库连接组件
UnADOQuery:=TADOQuery.Create(nil);
UnADOQuery.Connection:= UnADOConnection;
//创建线程
with QueryThread.Create(i, UnADOConnection, UnADOQuery) do
OnTerminate := ThreadDone;
end;
end;
//线程结束处理函数
procedure TForm1.ThreadDone(Sender: TObject);
begin
Dec(ThreadsRunning);
if ThreadsRunning = 0 then //判断线程是否都已经结束
begin
ShowMessage('查询完毕');
end;
end;
end.
查询线程代码如下:
unit Unit2;
interface
uses
Classes, Windows, SyncObjs, SysUtils, SqlExpr, Forms, ADODB, DB,Variants, StdCtrls, ExtCtrls, FMTBcd;
type
QueryThread = class(TThread)
private
{ Private declarations }
FADOConnection: TADOConnection; { 与查询组件相关的数据感知组件 }
FADOQuery: TADOQuery; { 线程中的查询组件 }
FIntRow:Integer;
protected
procedure Execute; override;
public
constructor Create(introw:Integer; Connection:TADOConnection;Query:TADOQuery);
end;
implementation
uses
Unit1;
{ QueryThread }
{ 线程查询类的构造器 }
constructor QueryThread.Create(introw:Integer; Connection:TADOConnection;Query:TADOQuery);
//线程的构造函数,执行初始化工作
begin
FIntRow:=introw;
FADOConnection:= Connection;
FADOQuery:= Query;
FreeOnTerminate := True; {让线程执行完毕后随即释放}
inherited Create(False);
end;
procedure QueryThread.Execute;
begin
AConnection.Connected:=True;
Query.Close;
Query.SQL.Clear;
//数据库查询
//查询zkxmzh
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('select count(rowid) from bj_yw_t_zkxmzh');
Query.Open;
Form1.StringGrid1.Cells[1, introw] := IntToStr(Query.Fields[0].AsInteger);
//查询ztry
Query.Close;
Query.SQL.Clear;
Query.SQL.Text:= 'select count(rowid) from bj_yw_t_ztry';
Query.Open;
Form1.StringGrid1.Cells[2, introw] := IntToStr(Query.Fields[0].AsInteger);
//查询sxz
Query.Close;
Query.SQL.Clear;
Query.SQL.Text:= 'select count(rowid) from bj_yw_t_sxz';
Query.Open;
Form1.StringGrid1.Cells[3, introw] := IntToStr(Query.Fields[0].AsInteger);
application.ProcessMessages;//同步显示
AConnection.Connected:=False;
AConnection.Close;
Form1.StringGrid1.Cells[4, introw] := '连接成功';
end;
end.
作者: wellwellsen 发布时间: 2011-08-26
代码写的多了点,望高手帮忙,小弟不胜感激
作者: wellwellsen 发布时间: 2011-08-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28