Ich habe das Problem, dass WaitForMultipleObjects nicht wartet.
Delphi-Quellcode:
function FindFilesThread(p: Pointer): Integer;
var
i : Integer;
cntFileLists : Integer;
DriveArray : TStringDynArray;
HandleArray : array of THandle;
ThreadID : Cardinal;
WorkingThreadParams: PWorkingThreadParams;
wfmo: DWORD;
begin
cntFileLists := PThreadParams(p)^.cntFileLists;
SetLength(FileList, cntFileLists);
SetLength(DriveArray, cntFileLists);
DriveArray := PThreadParams(p)^.DriveArray;
Setlength(HandleArray, cntFileLists);
for i := 0 to cntFileLists - 1 do
begin
GetMem(WorkingThreadParams, sizeof(TWorkingThreadParams));
FileList[i] := TStringList.Create;
WorkingThreadParams.Index := i;
WorkingThreadParams.Drive := DriveArray[i];
WorkingThreadParams.Filter := PThreadParams(p)^.Filter;
HandleArray[i] := BeginThread(nil, 0, @WorkingThread, WorkingThreadParams, 0, ThreadID);
end;
wfmo := WaitForMultipleObjects(length(HandleArray), @HandleArray, True, INFINITE);
if wfmo = WAIT_OBJECT_0 then
Messagebox(0, 'fertig', 'Test', 0);
FreeMem(p, sizeof(TThreadParams));
result := 0;
end;
Ich durchsuche alle verfügbaren Laufwerke nach bestimmten Dateien. Damit das schneller geht erstellt der Thread FindFilesThread für jedes Laufwerk einen Thread. Jeder Thread schreibt seine gefundenen Dateien in eine Stringlist. Ich habe ein Array von Stringlisten. Jeder Thread bekommt seine StringListe zugewiesen, in die er schreibt. Wenn alle Threads fertig sind, will ich in einer Schleife alle StringListen durchgehen und sie in einen Listview eintragen. Dazu muss ich aber warten bis alle Threads fertig sind - und genau das klappt nicht.
Rufe ich nach
wfmo := WaitForMultipleObjects(length(HandleArray), @HandleArray, True, INFINITE);
GetLastError auf bekomme ich den Fehler, dass das
Handle ungültig sei.
Ich debugge das jetzt schon über eine Stunde und finde den Fehler nicht.