怪问题,怎么用了10个线程比不用线程快一点,有时还比不用线程慢(100分)

  • 主题发起人 主题发起人 wind520
  • 开始时间 开始时间
W

wind520

Unregistered / Unconfirmed
GUEST, unregistred user!
我在数据库中添加记录(不用线程)
for i:=0 to List.count-1
begin
aStr:=List;
B:=Copy(aStr,1,4);
StrSQl:=' Insert into aa.dbf (Bh,name,Position)'+
' Select Bh,name,'+''''+aStr+''''+' from bb where name='''+B+'''';
Dm.ExecuteDate(DM.Query1,StrSQL);
end;

Function TDM.ExecuteDate(DataSet: TQuery;Str:String):Boolean;
begin
Result:=false;
with DataSetdo
begin
Close;
SQL.Clear;
SQL.Add(Str);
try
ExecSQL;
except
exit;
end;
end;
Result:=true;
end;
 
用线程:
Procedure Addrecode;
begin
CurrentFindThread:=0;
for i:=0 to List.count-1
begin
aStr:=List;
Repeat //设置阻塞操作
Application.ProcessMessages;
//ShowStatusBar1;
until CurrentFindThread<MaxFindThread;
try
TFindThread.Create(aStr);
// ShowStatusBar1;
except
beep;
end;
end;

Repeat
Application.ProcessMessages;
ShowStatusBar1;
until CurrentFindThread=0;

ShowMessage('ok');
end;


unit FindThread;
interface
uses
Classes,windows,SysUtils,DB, DBTables;
type
TFindThread = class(TThread)
private
{ Private declarations }
FADOQuery :TQuery;
FFileName :String;
FStrSQL :String;
procedure Scan;
Function GetSongName:Boolean;
protected
procedure Execute;
override;
Public
constructor Create(aFileName:String);
destructor Destroy;
override;
end;

Const
MaxFindThread=10;
var
CurrentFindThread:Integer;
implementation

{ TFindThread }
constructor TFindThread.Create(aFileName:String);
begin
FADOQuery :=TQuery.Create(nil);
FADOQuery.DatabaseName:='C:/aa/Data';
FFileName :=aFileName;
inc(CurrentFindThread);
FreeOnTerminate := True;
inherited Create(False);
end;

destructor TFindThread.Destroy;
begin
dec(CurrentFindThread);
FADOQuery.Free;
inherited Destroy;
end;

procedure TFindThread.Execute;
begin
Scan;
end;

procedure TFindThread.Scan;
var
aStr,B:String;
begin
{ Place thread code here }
aStr:=FFileName;
B:=Copy(aStr,1,4);
FStrSQL:=' Insert into aa.dbf (Bh,name,Position)'+
' Select Bh,name,'+''''+aStr+''''+' from bb where name='''+B+'''';
DM.ExecuteDate(FADOQuery,FStrSQL);

end;
end.
 
这里用线程没有用的,建议楼主先搞清楚线程的作用。
 
听你这么一说,
我也不想分析啦,
那你也该说为什么没用呀??哪里没用呀??,老兄
随便帮你UP一下咯,
呵呵~~~~~~~~~~~~~~~~~~~~~~
 
那怎么搞才可以提高速度问题呀,
因为bb有上万条记录,而且List.count>8000的
 
很简单,因为牵涉到了磁盘的读写,用多线程也不可能同时读写的;
如果只是想提高读(检索)的速度,可以考虑用以下方法:
1、合理使用索引;
2、减少主表字段,大的字段放在另一个辅助表中;
供参考。:)
 
数据库插入的速度是有限的,多线程并不能显著的提高速度
甚至还会造成速度的下降,
因为,数据库处理的速度是有限的
 
在数据库那边很多操作是串行操作的,口子只那么大,你在怎么多线程速度只有那么快
同时线程之间的切换很消耗CPU和内存,速度反而可能下降。
 
后退
顶部