Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

WaitForMultipleObjects wartet nicht

  Alt 15. Dez 2004, 19:06
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat