Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WaitForMultipleObjects wartet nicht (https://www.delphipraxis.net/36087-waitformultipleobjects-wartet-nicht.html)

Luckie 15. Dez 2004 19:06


WaitForMultipleObjects wartet nicht
 
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
Delphi-Quellcode:
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. :wall:

NicoDE 15. Dez 2004 19:21

Re: WaitForMultipleObjects wartet nicht
 
Zitat:

Zitat von Luckie
Ich habe das Problem, dass WaitForMultipleObjects nicht wartet. :(
Delphi-Quellcode:
  HandleArray : array of THandle;
  //...
  wfmo := WaitForMultipleObjects(length(HandleArray), @HandleArray, True, INFINITE);

Versuche es mit @HandleArray[0], ein dynamisches Array ist nur ein Pointer...

Luckie 15. Dez 2004 19:24

Re: WaitForMultipleObjects wartet nicht
 
Er ist nie da, aber wenn man ihn dann mal braucht, taucht er aus dem Nichts auf und hat die Lösung. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz