我用线程查询数据库里的数据,怎么才能把查到的记录数传递给主窗体的一个公共变量(100分)

  • 主题发起人 zhyhui2008
  • 开始时间
Z

zhyhui2008

Unregistered / Unconfirmed
GUEST, unregistred user!
我用线程查询数据库里的数据,怎么才能把查到的记录数传递给主窗体的一个公共变量,
下面是我的线程代码:
unit U_Qry_Thread;
interface
uses
SysUtils, Classes, DB, ADODB, DBClient, MConnect, SConnect,Windows,Dialogs, Messages,inifiles;
type
Qry_Thread = class(TThread)
private
{ Private declarations }
myinifile:TIniFile;
socket:TSocketConnection;
client:TClientDataSet;
fdatasource:TDataSource;
fthread_str:String;
f_count:Integer;
//变量
procedure Qry_Excete;
procedure showResult;
protected
procedure Execute;
override;{ 执行线程的方法 }
public
constructor Create(p_str,dsp_name:String;DataSource:TDataSource);
virtual;
{ 线程构造器 }
end;

implementation
uses U_Main, U_public, U_lytj, U_data;
{Qry_Thread}
procedure Qry_Thread.showResult;
begin
fdatasource.DataSet:=client;
// frm_lytj.Edit1.Text:=IntToStr(f_count);
end;

procedure Qry_Thread.Qry_Excete;
begin
with clientdo
begin
Close;
CommandText:= fthread_str;
Open;
end;
f_count:=client.RecordCount;
end;

procedure Qry_Thread.Execute;
begin
try
Synchronize(Qry_Excete);
Synchronize(showResult);
Except
ShowMessage('Query Error');
{ 线程异常 }
end;
end;

constructor Qry_Thread.Create(p_str,dsp_name:String;DataSource:TDataSource);
{ Place thread code here }
var
aHost,aServiceAddr,filename:string;
aport:Integer;
begin
filename:=ExtractFilePath(paramstr(0))+'config.ini';
myinifile:=Tinifile.Create(filename);
aServiceAddr:=myiniFile.ReadString('SERVER', 'ServiceAdd', '');
aHost:= myiniFile.ReadString('SERVER', 'ServiceHost', '');
aport:=StrToInt(myinifile.ReadString('SERVER','Port',''));
socket:=TSocketConnection.Create(nil);
socket.Address:=aServiceAddr;
socket.Host:=aHost;
socket.Port:=aport;
socket.ServerGUID:='{AF4DFB6F-EE54-4520-AE7F-3F0839A9350B}';
socket.ServerName:='P_server.tydgl_server';
socket.Connected:=true;
client:=TClientDataSet.Create(nil);
client.RemoteServer:=socket;
client.ProviderName:=dsp_name;
fdatasource:=DataSource;
fthread_str:=p_str;
// f_count:=qry_count;
inherited Create(false);
FreeOnTerminate := true;
end;
 
不知你的需求是怎样的
如果你的各个线程所连接的数据库是分布式的 那么你可以将获取回来的结果保存到同一个本地的但文件数据库的数据表中 所有线程执行完成后用一个dataset打开这个数据表即可
如果你的所有线程取的是同一个数据库中的数据 那你这样做没有什么意义 不能本质上提高性能
msn:ball_cao@hotmail.com
 
好像问题不大,用数组就搞定.
 
可以使用消息
 
顶部