Thema: Delphi Festplattenzugriffe

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.287 Beiträge
 
Delphi 12 Athens
 
#55

Re: Festplattenzugriffe

  Alt 6. Sep 2006, 13:56
Also, der Hauptgrund, warum FindFirstChangeNotificationW und ReadDirectoryChangesW zusammen war, lag darin, daß es in dem Code welcher als Vorlage dafür diehnte auch so war.

Und da ReadDirectoryChangesW in dieser Verbindung immer darauf wartet, bis etwas passiert und nicht vorher zurückkehrt (man es also auch nicht beenden konnte), hielt mich natürlich davon ab dieses FindFirstChangeNotificationW zu entfernen, da dort über WaitForSingleObject durch dem Timeout ein Abbruch möglich war ._.
Deshalb wird auch nur wenn etwas da ist (also WaitForSingleObject = WAIT_OBJECT_0) ReadDirectoryChangesW aufgerufen.

Hab inzwischen auch bemerkt, daß bei dir statt dessen CreateIoCompletionPort verwendet wird
und ReadDirectoryChangesW wartet nicht, wenn nichts vorhanden ist.



Find*ChangeNotificationW+WaitForSingleObject und CreateIoCompletionPort sind doch aber "nur" unterschiedliche Methoden, um auf ein Ereignis zu warten.
Da frag ich mich nun aber warum dann ReadDirectoryChangesW unterschiedlich reagiert.


mit Find*ChangeNotificationW+WaitForSingleObject:
-wartet bis zu einem Ereignis (1)
-liefert nur den Dateinamen und kein Verzeichnis
-liefert nur das letzte Ereignis
-manchmal liefert es garnichts und warte auf das nächste Ereignis.

mit CreateIoCompletionPort:
-kehrt immer sofort wieder zurück (1)
-liefert den kompletten Pfad

(1) inwischen geklärt, dat kommt wohl durchs Overlapt.

Zitat:
// Synchron lässt sich der Thread nicht sauber beenden, wenn
// ReadDirectoryChangesW auf die Auslösung des Ereignisses wartet
Läßt er sich schon ... indem man ReadDirectoryChangesW nicht aufruft.



PS: ich seh nichts doppelt.
(zum Test 'ne Datei umbenannt)
Zitat:
X:\USB-Stick\Programme\DirectoryCompareClass.pas
X:\USB-Stick\Programme\DirectoryCompareClass.pas_
Auch nachdem alle Ereignisse überwacht werden ... nicht doppeltes
(FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_CREATION)
Zitat:
X:\USB-Stick\Programme\DirectoryCompareClass.pas_
X:\USB-Stick\Programme\DirectoryCompareClass.pas
X:\USB-Stick\Programme
X:\USB-Stick\Programme\DirectoryCompareClass.pas
Hab mal 'ne Erweiterung (Angabe der Aktion) drangehängt (beide Änderungen mit {*} am Zeilenanfang gekennzeichnet).
Eventuell liefert das ja eine mögliche Antwort ^^
Zitat:
OLD NAME: X:\USB-Stick\Programme\DirectoryCompareClass.pas_
NEW NAME: X:\USB-Stick\Programme\DirectoryCompareClass.pas
MODIFIED: X:\USB-Stick\Programme
MODIFIED: X:\USB-Stick\Programme\DirectoryCompareClass.pas
Angehängte Dateien
Dateityp: pas csabmw10_main_652.pas (8,0 KB, 37x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat