![]() |
WaitForMultipleObjects - finde den Fehler nicht [solved]
Habe mir eine Klasse geschrieben, die mehrere Verzeichnisse gleichzeitig per FindFirstChangeNotification überwachen kann. Leider bekomme ich immer Wait_Failed zurück.
Delphi-Quellcode:
Hier der Aufruf:
{ TDirWatcherThread }
function TDirWatcherThread.CheckNewPath: Boolean; begin end; constructor TDirWatcherThread.Create(ExeFunc: TExecuteOnChange; Path: string; WatchSubTrees: Boolean; NotifyFilter: LongWord); begin inherited Create(false); Priority := tpNormal; FreeOnTerminate := True; SetNewPath(ExeFunc, Path, WatchSubTrees, NotifyFilter); end; procedure TDirWatcherThread.DeletePath(Index: Integer); begin end; destructor TDirWatcherThread.Destroy; var I: Integer; begin for I := 0 to High(FHandleArray) do begin FindCloseChangeNotification(FHandleArray[I]); end; Finalize(FHandleArray); Finalize(FExecuteFuncList); inherited; end; procedure TDirWatcherThread.Execute; var I: Integer; begin while not Terminated and (Length(FHandleArray) > 0) do begin FWaitStatus := WaitForMultipleObjects(Length(FHandleArray), @FHandleArray, False, 500); if FWaitStatus = WAIT_FAILED then Exit; if (FWaitStatus >= WAIT_OBJECT_0) and (FWaitStatus <= High(FHandleArray)) then begin //der nachfolgende Block fängt viele hintereinander auftretende Notfications des //gleichen Handles erstmal an, damit die auszuführende Funktion nicht unnötig oft //gefeuert wird FindNextChangeNotification(FHandleArray[FWaitStatus]); while WaitForSingleObject(FHandleArray[FWaitStatus], 500) = WAIT_OBJECT_0 do FindNextChangeNotification(FHandleArray[FWaitStatus]); //hier wird die verknüpfte Funktion des z.B. ListViews angesprochen Synchronize(ExecuteOnChange); end; //alle Handles im Array 'auffrischen' for I := 0 to High(FHandleArray) do FindNextChangeNotification(FHandleArray[I]); end; end; procedure TDirWatcherThread.ExecuteOnChange; begin //Hier wird sozusagen die übergebene 'OnNotification'-Funktion aufgerufen //für den Fehler irrelevant FExecuteFuncList[FWaitStatus]; end; //public, ersetzt eine Pfad der bereits im Array der zu überwachenden Handles steht procedure TDirWatcherThread.ReplacePath(Index: Integer; ExeFunc: TExecuteOnChange; Path: string; WatchSubTrees: Boolean; NotifyFilter: LongWord); var TempHandle: THandle; begin TempHandle := FindFirstChangeNotification(PChar(Path), WatchSubTrees, NotifyFilter); if TempHandle <> INVALID_HANDLE_VALUE then begin if Index > High(FHandleArray) then Exit; FHandleArray[Index] := TempHandle; FExecuteFuncList[Index] := ExeFunc; end; end; //public, ein neuer zu überwachender Pfad wird in den Array eingefügt function TDirWatcherThread.SetNewPath(ExeFunc: TExecuteOnChange; Path: string; WatchSubTrees: Boolean; NotifyFilter: LongWord): Integer; var TempHandle: THandle; begin Result := -1; TempHandle := FindFirstChangeNotification(PChar(Path), WatchSubTrees, NotifyFilter); if TempHandle <> INVALID_HANDLE_VALUE then begin //den neuen Handle in die Liste einfügen SetLength(FHandleArray, Length(FHandleArray) + 1); FHandleArray[High(FHandleArray)] := TempHandle; Result := High(FHandleArray); //die auszuführende Funtion in den Array einfügen SetLength(FExecuteFuncList, Length(FExecuteFuncList) + 1); FExecuteFuncList[High(FExecuteFuncList)] := ExeFunc; end; end;
Delphi-Quellcode:
Danke für Eure Hilfe!
//dieser wird vom ListView ausgeführt, UpdateAllItems ist eine Funktion des ListViews,
//welche bei einer Notification ausgeführt werden soll if not Assigned(FDirWatcherThread) then FDirWatcherThread := TDirWatcherThread.Create(UpdateAllItems, 'c:\', False, FILE_NOTIFY_CHANGE_FILE_NAME); vielleicht noch wichtig:
Delphi-Quellcode:
TExecuteOnChange = procedure of object;
//private-Deklarationen des TDirWatchers: FHandleArray: array of THandle; FExecuteFuncList: array of TExecuteOnChange; |
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Kann man WaitForMultipleObjects vielleicht nur mit einem Array der Länge 2 aufrufen?
Vorher hatte ich die Klasse für einen Handle programmiert mit WaitForSingeObject hat es auch gut funktioniert. |
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Nein, man kann es mit Ararys beliebiger Länge aufrufen. Dein Fehler muss wo anders sein. Leider steige ich durch den Quelltext nicht so ganz durch, ein paar Kommentare wären hilfreich.
|
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Zitat:
Habe ein paar Kommentare eingefügt. Ich hoffe ich habe nicht zu viele triviale Dinge kommentiert. Bitte sag' bescheid, falls noch etwas unklar sein sollte. Grüße Sebastian |
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
der Fehler liegt vermutlich hier:
Delphi-Quellcode:
versuch es mal mit:
FWaitStatus := WaitForMultipleObjects(Length(FHandleArray), @FHandleArray,False, 500);
Delphi-Quellcode:
(ohne [0] erhält man mit @ die Adresse auf die Adresse des Array.... mit [0] die Adresse auf das 1. Element, so wie es WaitForMu... erwartet...)
FWaitStatus := WaitForMultipleObjects(Length(FHandleArray), @FHandleArray[0],False, 500);
|
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Zitat:
Eventuell kuckst du dir auch noch mal mein überarbeitetes ![]() |
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Zitat:
Eigentlich müsste es etwa so aussehen:
Code:
Wie man an der Deklaration von TWOHandleArray erkennt, sollte das Array nicht mehr als 64 Elemente enthalten...
WaitForMultipleObjects(Length(FHandleArray), PWOHandleArray(Addr(FHandleArray[0])), False, 500);
|
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Zitat:
Habe FHandleArray[0] probiert, so wie es z.B. das IContextMenu haben möchte, aber auf @HandleArray[0] bin ich natürlich nicht gekommen. Absolut logisch. (Wie so oft, wenn man den Fehler endlich hat.) :) Grüße Sebastian |
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
@Nico: Mit beliebig meinte ich auch, dass man es nicht übertreiben soll. ;) Mist, jetzt frage ich mich, ob ich das in meinem Threading Tutorial erwähnt habe. :gruebel:
PS: Wenn du willst, kannst du es ja mal querlesen. ;) |
Re: WaitForMultipleObjects - finde den Fehler nicht :O(
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz