{ Die cdecl Funktion GetFiles() besitzt zwei Parameter vom Typ string und object, die hier ganz normal deklariert werden. }
procedure GetFiles(
const Directory:
string; Filenames: TStrings);
cdecl;
var
h: THandle;
FindData: TWin32FindData;
begin
h := FindFirstFile(PChar(Directory + '
\*.*'), FindData);
if h <> INVALID_HANDLE_VALUE
then
begin
repeat
if (StrComp(FindData.cFileName, '
.') <> 0)
and (StrComp(FindData.cFileName, '
..') <> 0)
then
begin
Filenames.Add(Directory + '
\' + FindData.cFileName);
if FindData.dwFileAttributes
and FILE_ATTRIBUTE_DIRECTORY <> 0
then
GetFiles(Filenames[Filenames.Count - 1], Filenames);
end;
until not FindNextFile(h, FindData);
Windows.FindClose(h);
end;
end;
procedure TFormMain.ButtonGetFilesClick(Sender: TObject);
var
Dir1, Dir2, Dir3: IAsyncCall;
Dir1Files, Dir2Files, Dir3Files: TStrings;
begin
Dir1Files := TStringList.Create;
Dir2Files := TStringList.Create;
Dir3Files := TStringList.Create;
ButtonGetFiles.Enabled := False;
try
{ Die beiden Parameter der GetFiles() Funktion werden mittels eines const array of const übergeben }
Dir1 := AsyncCall(@GetFiles, ['
C:\Windows', Dir1Files]);
Dir2 := AsyncCall(@GetFiles, ['
D:\Html', Dir2Files]);
Dir3 := AsyncCall(@GetFiles, ['
E:', Dir3Files]);
{ Warten bis die beiden asynchronen Funktion beenden sind. Während dieser Zeit dem die UI nicht einfrieren lassen }
while AsyncMultiSync([Dir1, Dir2], True, 10) < 0
do
Application.ProcessMessages;
Dir3.Sync;
// Auf die Beendigung der Dir3 Funktion warten
MemoFiles.Lines.Assign(Dir1Files);
MemoFiles.Lines.AddStrings(Dir2Files);
MemoFiles.Lines.AddStrings(Dir3Files);
finally
ButtonGetFiles.Enabled := True;
Dir3Files.Free;
Dir2Files.Free;
Dir1Files.Free;
end;
end;