如何优化TDataSetProvider的数据打包过程 ( 积分: 200 )

  • 主题发起人 主题发起人 fly_crane
  • 开始时间 开始时间
F

fly_crane

Unregistered / Unconfirmed
GUEST, unregistred user!
三层的C/S结构,速度比较慢,特别是巢状数据(我们报名主从打印只支持巢状数据)。所以想在PROVIDER的打包过程上做优化,我在下面的这个函数:
function TEXDataPacketWriter.WriteDataSet(DataSet: TDataSet;
var Info: TEXInfoArray;
中创建多线程来完成数据的打包过程,并且在打包过程中终止主线程
while not ((WritePacketThread.Finished) and (WritePacketThread1.Finished))do
SuspendThread(MainThreadID);
ResumeThread(mainThreadID);
期待执行效果就想FLASHGET一样,多线程组织完数据,回到主线程中进行数据传输,但是当我创建单一进程的时候没有问题,运行的时候并不能把所有的数据巢状数据获取出来。我的线程创建如下:
constructor TWritePacketThread.CreateInstance(var Info: TEXInfoArray;DataSet: TDataSet;IDSWriter:IDSWriter;RecNo,RecsOut:Integer);
var i:integer;
begin
inherited Create(true);
FreeOnTerminate:=true;
FDataSet:=TADOQuery.Create(nil);
TAdoQuery(FDataSet).Connection:=TAdoQuery(DataSet).Connection;
TAdoQuery(FDataSet).SQL.text:=Trim(TAdoQuery(DataSet).SQL.Text);
FDataSet.Open;
FIDSWriter:=IDSWriter;
Finfo:=copy(Info,0,length(info));
FRecNo:=RecNo;
FRecsOut:=RecsOut;
FFinished:=FALSE;
Suspended:=FALSE;
end;

destructor TWritePacketThread.Destroy;
begin
//inherited Destroy;
FDataSet.Free;
inherited;
end;

procedure TWritePacketThread.Execute;
begin
if FDataSet.Active then
begin
SynMethod;
Finished:=TRUE;
end;
end;

procedure TWritePacketThread.SetFinished(const Value: Boolean);
begin
FFinished := Value;
end;

procedure TWritePacketThread.SynMethod;
const
B: Byte = 0;
var
Result,i:integer;
Flag:Boolean;
begin
//inherited;
Result:=0;
FDataSet.RecNo:=FRecNo;
Flag:=false;
while (not FDataSet.EOF) and (Result < FRecsOut)do
begin
FIDSWriter.PutField(fldIsChanged, 1, @B);
for i := 0 to High(FInfo)do
begin
if Flag then
begin
FInfo.DataSet.Next;
flag:=false;
end;
FInfo.PutProc(@FInfo);
end;
Inc(Result);
if Result < FRecsOut then
begin
fDataSet.Next;
end;
Flag:=true;
end;
end;
有哪位高手能帮我解决一下,不胜感谢。如果有更好的解决三层数据速度性能问题的方法,欢迎提出好的建议。
 
為什麼要這樣做?其實在主表的afterscrol事件寫select * from 從表的數據不是更好,多線程如果是單cpu根本就和單線程一樣
 
呵呵,我在问题中说了我们的报表打印控件如果打印主从表只支持巢状数据。所以现在的系统全是巢状数据。那么优化也只能从这点来进行了。即使是单CPU,我想多线程执行也比单线程快,我想要的效果和FLASHGET一样,可以把数据分成几段,每个线程分别包装,然后放到一起。
感谢psynet123的回复,期待各位高手继续回答
 
大家有好的想法发我邮箱,谢谢
fly_Crane@163.com
 
欢迎大家来讨论这个问题
 
FLASHGET多线程是因为它的性能瓶颈在网络传输上,所以它采用多线程传输
psynet123说得对,如果仅是打包,算法相同的情况下,单CPU多线程和单线程效率是差不多的,甚至还不如单线程
你得确认你的性能瓶颈在哪,然后再在那方面优化,多线程不是万能药
 
网络传输的原则:尽量减少传输次数;每次只传输变化的部分(TClientDataSet.delta部分);
还可以压缩要传输的数据包;
参考:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3816911
 
后退
顶部