BDE 경로에 데이터베이스 파일을 추가하기 위해 데이터베이스 파일이있는 디렉토리의 드라이브를 스캔해야합니다. 스레드를 사용하여 코드를 더 빨리 수행하려면 어떻게해야합니까? delphi 2007을 사용 중이므로 omniThread가 지원되지 않습니다. 스레드를 만드는 방법과 스레드를 실행하는 방법을 알아야합니다. 이것은 내 코드입니다. 감사합니다.다중 스레드를 사용하여 데이터베이스 디렉토리를 검색하는 Delphi
procedure TMainFrm.RestoreDBDirs;
var
Lst: TStringList;
Dirs: string;
Counter, j, LstFrom, LstTo: integer;
SearchRec: TSearchRec;
ST: TScanThread;
begin
Screen.Cursor:= crHourGlass;
try
try
ChangeAlias(AliasCombo);//After this procedure the tables are closed
except
end;
Lst:= TStringList.Create;
Lst.Clear;
Counter:= 0;
if Assigned(ChooseDrvFrm) then
with ChooseDrvFrm do
begin
Lst.Add(lvDrives.Selected.Caption);
Dirs:= lvDrives.Selected.Caption;
Progress1.Position:= 0;
Progress1.Visible:= True;
stBar1.SimpleText:= 'Searching for Databases...';
end
else
begin
Lst.Add(GetSystemDrive);
Dirs:= GetSystemDrive;
end;
repeat
// Update Progress Bar
if Assigned(ChooseDrvFrm) then
with ChooseDrvFrm do
begin
Progress1.StepBy(1);
if Progress1.Position = Progress1.Max then
Progress1.Position:= 0;
end;
Dirs:= Lst.Strings[Counter] +'\';
if (Dirs <> '.') and (Dirs <> '..')then
if FindFirst(Dirs +'*.*', faDirectory, SearchRec) = 0 then
begin
if ((SearchRec.Attr and faDirectory) > 0)
and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
Lst.Add(Dirs + SearchRec.Name);
if Assigned(ChooseDrvFrm) then
ChooseDrvFrm.stBar1.SimpleText:= Dirs + SearchRec.Name;
end;
while FindNext(SearchRec) = 0 do
if ((SearchRec.Attr and faDirectory) > 0) and
(SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
Lst.Add(Dirs + SearchRec.Name);
if Assigned(ChooseDrvFrm) then
ChooseDrvFrm.stBar1.SimpleText:= Dirs + SearchRec.Name;
end;
end;
Counter:= Counter + 1;
FindClose(SearchRec);
until Counter = Lst.Count;
Dirs:= '';
if Assigned(ChooseDrvFrm) then
ChooseDrvFrm.Progress1.Position:= 0;
for Counter:= 0 to Lst.Count - 1 do
begin
if Assigned(ChooseDrvFrm) then
with ChooseDrvFrm do
begin
Progress1.StepBy(1);
if Progress1.Position = Progress1.Max then
Progress1.Position:= 0;
end;
if (FileExists(Lst.Strings[Counter] + '\Crt.DB'))
and (FileExists(Lst.Strings[Counter] + '\Ds.DB'))
and (FileExists(Lst.Strings[Counter] + '\Turim.DB'))
and (FileExists(Lst.Strings[Counter] + '\Rprt.DB'))
and (UpperCase(Lst.Strings[Counter]) <> UpperCase('C:\My Installations\Data'))
and (UpperCase(Lst.Strings[Counter]) <> UpperCase(ExtractFileDir(ParamStr(0)))) then
try
if Assigned(ChooseDrvFrm) then
ChooseDrvFrm.stBar1.SimpleText:= 'Restoring Databases: '+ Lst.Strings[Counter];
RestoreAlias(Lst.Strings[Counter]);
except
on EDatabaseError do;
end;
end;
if Assigned(ChooseDrvFrm) then
with ChooseDrvFrm do
begin
Progress1.Position:= 0;
Progress1.Visible:= False;
stBar1.SimpleText:= 'Done';
MessageDlg('Databases succesfully restored', mtInformation, [mbYes], 0);
Close;
end;
> FillAliasCombo; finally
> Lst.Free;
> Screen.Cursor:= crDefault; end;
아마도 이것은 끔찍한 생각입니다. 스레딩 때문이 아니라 인덱싱되지 않은 네트워크 리소스에 막대한 양의 구문 분석이 포함되기 때문입니다. 스레딩을 사용하더라도 모든 스레드가 완료 될 때까지 기다려야하며 네트워크 드라이브에 액세스하는 시간 초과는 몇 분을 초과 할 수 있습니다. – mg30rg
[앞 페이지] (http://otl.17slon.com/)에는 D2007이 지원됩니다. –