AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Festplattenzugriffe

Ein Thema von Slavik · begonnen am 20. Nov 2004 · letzter Beitrag vom 24. Nov 2006
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#51

Re: Festplattenzugriffe

  Alt 5. Sep 2006, 03:33
Moin Mackhack,

ich habe einmal die Konstante _iFilenameLength angelegt, da diese in der Hauptroutine, als Anzahl Bytes die maximal kopiert werden dürfen, so benötigt wird.
Da das Array aber nur halb soviele Elemente braucht (WChar ist zwei Byte gross), teile ich an der Stelle den Wert durch 2.

SHR ist zwar zum rechnen da, aber das passiert da ja auch

Da beide Werte konstant sind (_iFilenameLength und natürlich die 1) wird dies schon beim compilieren erledigt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#52

Re: Festplattenzugriffe

  Alt 5. Sep 2006, 17:01
Kann mir jemand meine Fragen vom Edit vlt. bitte beantworten. Das laege mir sehr am Herzen das mal zu verstehen...

Vielen Dank!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#53

Re: Festplattenzugriffe

  Alt 5. Sep 2006, 17:26
Moin Mackhack,

Zitat von Mackhack:
Warum musst du hier das Struct (Record) OVERLAPPED nicht in der Delphi-Unit deklarieren aber das Struct (Record) FILE_NOTIFY_INFORMATION musst du deklariern.
Ich hatte gehofft, dass dies durch die Kommentare in der Demo deutlich geworden ist:
FILE_NOTIFY_INFORMATION musste ich selber deklarieren, da diese Deklaration bei Delphi nicht mitgeliefert wurde, OVERLAPPED hingegen schon (unit Windows).

Zitat von Mackhack:
Das ist etwas im allgemeinen das ich noch nie im Zusammenhang mit der MSDN/API verstanden habe wann ich ein Struct deklarieren muss und wann nicht. Gibt dafuer n einfaches Hint fuer mich und vlt. auch fuer viele/einige andere hier?
Selber deklarieren musst Du alles, was
  1. bei Delphi nicht deklariert wurde
  2. in einer Form deklariert wurde, die man so nicht gebrauchen kann.
    Beispiel: MSDN-Library durchsuchenExtractIconEx
    Es ist bei Delphi üblich, dass Parameter, die Werte von einer Funktion zurückerhalten als var-Parameter deklariert werden (was es ja in C nicht so gibt). Dies ist auch bei der o.g. Funktion geschehen. Will man nun aber die Liste verarbeiten, die die Funktion normalerweise zurückgibt, klappt das mit der Deklaration nicht, und man muss die Funktion, mit anderer Deklaration, selber importieren (genau für diese Funktion gibt es bei Borland sogar einen Artikel dazu)
  3. seit der mitgelieferten Deklaration in Windows aktualisiert (ergänzt) wurde, und von Dir in der aktuellen Version gebraucht wird.
    Beispiel:
    MSDN-Library durchsuchenGetOpenFilename bzw. MSDN-Library durchsuchenOPENFILENAME-Structure
    In D5 ist nur die "alte" Deklaration enthalten, ohne Placesbar.

Im Allgemeinen wirst Du oft Funktionen / Strukturen selber deklarieren müssen, die es nur unter NT/2000/XP gibt, nicht aber unter 9x/ME, da diese meist nicht vordeklariert sind.
Warum jetzt ReadDirectoryChangesW deklariert wurde, nicht aber die hierfür benötigte Struktur FILE_NOTIFY_INFORMATION müsstest Du bei Borland anfragen (zumindest konnte ich die Deklaration nirgends finden, auch nicht in D2006).

Manche Sachen, die sonst fehlen kannst Du auch woanders finden (vieles z.B. in den Jedis), aber ich verwende da lieber eigene Deklarationen (bei Funktionen), um die Funktionen C-typisch deklariert zu bekommen, also ohne var-Parameter, weil ich es damit leichter habe Beispiele umzusetzen, und mir auch keine Gedanken darum machen muss, ob das mit einem var-Parameter überhaupt wie gewünscht funktioniert (siehe ExtractIconEx).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#54

Re: Festplattenzugriffe

  Alt 5. Sep 2006, 17:30
Hallo Christian,

vielen Dank fuer die Erklaerung. Sieht alles schon wesentlich besser aus jetzt
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 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)
$2B or not $2B
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#56

Re: Festplattenzugriffe

  Alt 6. Sep 2006, 14:15
Moin Himitsu,

Zitat von himitsu:
PS: ich seh nichts doppelt.
dann probiere es mal nur mit FILE_NOTIFY_CHANGE_LAST_WRITE.

Zitat von himitsu:
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.
Das ist ja ein Wiederspruch in sich, denn wenn man die Funktion nicht aufruft, kann sie natürlich auch nicht hängenbleiben


[EDIT]
Zitat von himitsu:
mit Find*ChangeNotificationW+WaitForSingleObject:
-wartet bis zu einem Ereignis (1)
-liefert nur den Dateinamen und kein Verzeichnis
IMHO liefert Find*ChangeNotification nur die Information dass sich etwas getan hat, aber in keinster Weise welche Datei/Verzeichnis davon betroffen sind (mal abgesehen davon, dass man ja wissen sollte, was man überwacht )

Zitat von himitsu:
mit CreateIoCompletionPort:
-kehrt immer sofort wieder zurück (1)
-liefert den kompletten Pfad
Es wird der Pfad relativ zum überwachten zurückgegeben, aber nicht der komplette Pfad.
[/EDIT]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Festplattenzugriffe

  Alt 6. Sep 2006, 14:29
Zitat von Christian Seehase:
Das ist ja ein Wiederspruch in sich, denn wenn man die Funktion nicht aufruft, kann sie natürlich auch nicht hängenbleiben
Aber es funktioniert
Also erst mit irgendwas anderem prüfen ob es überhaupt was gibt und nur wenn was vorhanden ist, dann dieses abfragen

Zitat von Christian Seehase:
IMHO liefert Find*ChangeNotification nur die Information dass sich etwas getan hat, aber in keinster Weise welche Datei/Verzeichnis davon betroffen sind (mal abgesehen davon, dass man ja wissen sollte, was man überwacht )
Darum ist es doch nett, man prüft damit ob was da ist und kann dann in gutem Gewissen ReadDirectoryChangesW aufrufen

Is aber erstmal raus, ohne und asynchron läuft es ja auch ganz nett ^^

Zitat von Christian Seehase:
Es wird der Pfad relativ zum überwachten zurückgegeben, aber nicht der komplette Pfad.
Mein ich ja , halt den kompletten Pfad, ab da wo man sucht (is mir auch recht so, weil ich den sonst erst wieder entfernen müßte)
$2B or not $2B
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#58

Re: Festplattenzugriffe

  Alt 6. Sep 2006, 14:44
Moin Himitsu,

Zitat von himitsu:
Darum ist es doch nett, man prüft damit ob was da ist und kann dann in gutem Gewissen ReadDirectoryChangesW aufrufen
Aber wenn Find*ChangeNotification eine Änderung festgestellt hat, wird ReadDirectoryChangesW nicht die gleiche Veränderung feststellen können, da das Ereignis ja schon eingetreten ist, bevor die Funktion aufgerufen wurde.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Festplattenzugriffe

  Alt 6. Sep 2006, 14:52
Na das würde auch eines der Probleme damit erklären, aber die Idee stammt zum Glück nicht von mir und wandert dennoch fröhlich um die Welt
Bei Google suchenReadDirectoryChangesW FindFirstChangeNotification
$2B or not $2B
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#60

Re: Festplattenzugriffe

  Alt 6. Sep 2006, 15:04
Moin Himitsu,

da es bei den beiden Suchbegriffen reichlich Fundstellen gibt:
Welche Site meinst Du?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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