对于多个文件导入任务,两三个任务而言可能处理起来很快,如果是几十个几百个,如果按顺序去一个一个执行就会很耗时,使用者体验也不是很好。这个时候我们可以采用定时器的方式,一个任务对应一个定时器,这个时候几个任务串行进行,就会很快。
下面就是例子:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
FireDAC.Stan.Async, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet,
FireDAC.Comp.Client,System.Generics.Collections;
type
TmyTime = class(TTimer)
procedure Timer1Timer(Sender: TObject);
private
Filepath: string; //文件名
protected
procedure setvalue(Filepath: string);
end;
TForm1 = class(TForm)
btn1: TButton;
fdqry1: TFDQuery;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
listTime: TList<TmyTime>;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Bulk(Filename: string; list: Tstringlist);
var
search: TSearchRec;
aClass: Variant;
ret: Integer;
key: string;
strFile, strname: string;
begin
try
Filename := Filename + '\';
key := Filename + '*.*'; //下级目录未找到递归找直到找到为止
ret := FindFirst(key, faAnyFile, search);
try
while ret = 0 do
begin
if ((Pos('.csv', LowerCase(search.name))) > 0) then
begin
list.Add(Filename + search.name);
end;
if Pos('.', search.Name) = 0 then
Bulk(Filename + search.name,list);
ret := FindNext(search);
end;
finally
findclose(search);
end;
except
on E: Exception do
begin
Exit;
end;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
list: TStringList;
TimmerTask: TmyTime;
begin
try
list :=TStringList.Create;
Bulk('文件夹名',list); //获取文件名
for var i := 0 to listTime.Count-1 do
listTime[i].Free;
listTime.Clear;
for var i := 0 to list.count-1 do
begin
TimmerTask := TmyTime.Create(nil);
TimmerTask.Interval := 10;
TimmerTask.Filepath :=list.Strings[i];
TimmerTask.Enabled := True;
listTime.Add(TimmerTask);
end;
finally
list.Free;
end;
end;
{ TmyTime }
procedure TmyTime.setvalue(Filepath: string);
var
FDqr1: TFDQuery;
con1: TFDConnection;
list: TStringList;
sql: string;
begin
try
list :=TStringList.Create;
list.LoadFromFile(Filepath);
FDqr1 := TFDQuery.Create(nil);
con1 := TFDConnection.Create(nil);
con1.ConnectionString := '';
con1.Connected := True;
FDqr1.Connection := con1;
for var i := 0 to list.Count-1 do
begin
sql :=sql+这里添加文件的数据;
end;
FDqr1.SQL.Clear;
FDqr1.SQL.Text := sql;//将数据添加到数据库中
FDqr1.ExecSQL;
con1.Commit;
finally
FDqr1.Free;
con1.Free;
list.Free;
end;
end;
procedure TmyTime.Timer1Timer(Sender: TObject);
begin
setvalue(Filepath);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
listTime := TList<TmyTime>.create;;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
for var i := 0 to listTime.Count-1 do
listTime[i].Free;
listTime.Free;
end;
end.