求救多线程查询数据库!在线等待 (67分)

D

del_man

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高人,下面是小弟做的一个多线程的测试,我想把它放在中间层服务器上跑。小第对多线程从来没有接触过,看了几个例子盗版了一个,不知道对错,请大家不要见笑。
unit mrp130ya;
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,Dialogs,
DBClient, ymrp130_TLB, StdVcl, Db, ADODB,Controls, Provider,ActiveX;
type
Tmythread = class(TThread)
private
{ Private declarations }
FConnection:TAdoConnection;
FQuery:TAdoQuery;
FProvider:TDatasetprovider;
procedure ConnectDataSource;
protected
procedure Execute;
override;
public
Constructor Create(Suspended:Boolean;Query:TAdoquery;Provider:TDatasetprovider);
destructor Destroy;override;
end;

implementation
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Tmythread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
{ Tmythread }
procedure Tmythread.ConnectDataSource;
begin
FProvider.DataSet:=FQuery;
end;

constructor Tmythread.Create(Suspended: Boolean;
Query: TAdoquery;
Provider: TDatasetprovider);
begin
CoInitialize(nil);
try
FConnection:=TAdoConnection.Create(nil);
FQuery:=query;
FProvider:=Provider;
FQuery.Connection:=FConnection;
with FConnectiondo
begin
LoginPrompt:=False;
KeepConnection:=true;
ConnectionString:='Provider=MSDASQL.1;Password=123;Persist Security Info=True;User ID=123;Data Source=123';
end;
inherited Create(Suspended);
except
on e:Exceptiondo
begin
showmessage(e.Message);
end;
end;
end;

destructor Tmythread.Destroy;
begin
FConnection.free;
CoUninitialize;
inherited Destroy;
end;

procedure Tmythread.Execute;
begin
try
FreeOnTerminate:=true;
Fquery.Close;
Fquery.SQL.Clear;
Fquery.SQL.Add('select * from t1');
Fquery.Open;
Synchronize(ConnectDataSource);
except
end;
end;
end.
然后我在中间层定义好了一个方法
procedure Tdmmrp130y.test(var data: OleVariant);
begin
Tmythread.Create(false,ADOQuery2,DataSetProvider1);
//do other ...

data:=DataSetProvider1.data;
end;
现在的问题是1。DataSetProvider1.data 是不是就是线程查询出来的数据集?
2。data:=DataSetProvider1.data;这句话必须要等线程结束了才可以执行,
我该怎么等待?
小弟只有这些分了,如果不过,等我以后有分了另外补上,谢谢!!!
 
1、是。
2、
procedure Tmythread.ConnectDataSource;
begin
FProvider.DataSet:=FQuery;
dmmrp130y.data:=FProvider.data
end;
 
to:迷糊
老大,"dmmrp130y.data:=FProvider.data"这句话是什么意思啊,能不能详细点?谢谢!!
 
我的意思是把“data:=DataSetProvider1.data;”赋值写到线程类里边。
由于你的代码贴的不全,我把dmmrp130y作Tdmmrp130y的实例,data 作Tdmmrp130y的公用变量。你自己变通一下
 
to:迷糊
非常感谢!!不过小弟还有一事不明白,当我客户端调用test方法时候,主线程怎么知道mythread线程查询完毕,可以传递数据?谢谢了!!
 
可以通过一个标识,mythread线程查询完毕之后修改这个标识。
也可以在mythread线程查询完后发一个自定义消息,在主线程中捕捉这个消息。
 
to:迷糊
谢谢你的热情帮忙,可是现在我又遇到了一个问题,什么是“尚未CoInitialize”啊?
老大,你有没有时间啊,不如写个测试用的程序发到我邮箱来吧。最好是三层的
先谢谢了!!h_hp@netease.com
 
在线程中
ado
没有自动初始化
要先CoInitialize
运行后再
CoInitialize
 
又多了一位好心人,非常感谢!!但要在那里CoInitialize?程序该如何改呢?
谢谢为盼!!
 
看你的代码好像已经初始化了,你最好单步执行看一下出错在什么地方。
是不是连接没有打开啊?在线程create方法中加下面一句试试:
LoginPrompt:=False;
KeepConnection:=true;
ConnectionString:='Provider=MSDASQL.1;Password=123;Persist Security Info=True;User ID=123;Data Source=123';
open;
//加此句,打开连接。
end;
另:例子你看看delphi的demos吧,我。。。懒!:)

 
2.你可以写在线程OnTerminate事件里的
 
谢谢大家的帮忙!!
 
多人接受答案了。
 
顶部