AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ReadDirectoryChangesW endet in einer Endlosschleife
Thema durchsuchen
Ansicht
Themen-Optionen

ReadDirectoryChangesW endet in einer Endlosschleife

Ein Thema von BenjaminH · begonnen am 20. Mär 2007 · letzter Beitrag vom 21. Mär 2007
Antwort Antwort
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#1

ReadDirectoryChangesW endet in einer Endlosschleife

  Alt 20. Mär 2007, 18:25
Hallo,
ich beschäftige mich seit einer Zeit mit MSDN-Library durchsuchenReadDirectoryChangesW
Das funktioniert im Allgemeinen auch. Nur nicht im besonderen.
Es passiert manchmal, dass ich eine Datei erstelle und dann das ganze stecken bleibt.
D.h. weitere Dateiänderungen nicht festgestellt werden, oder immer wieder dasselbe ausgegeben wird, und währenddessen andere Dateiänderungen auch nichts zu sagen haben.
Das passiert im Prinzip immer dann, wenn mit OpenOffice eine neue Datei angelegt wird. Ist meiner Meinung nach also reproduzierbar.
Was noch passierte ist folgendes:
Code:
\Verzeichnis\Date.odt - erstellt
\Verzeichis\ - geändert
\Verzeichnis\Date.odt - gelöscht
Alles was danach passierte wurde ignoriert, die Datei existierte aber definitiv.

Als ich in einer dieser "Endlosschleifen" das Programm beendet habe, endete das in einer AccessViolation, die ich im Thread vermute. Da der ja beim Terminate ruhig abgeschaltet werden müsste vermute ich den Fehler in der Repeat Schleife, damals hatte ich da das or terminated nicht drinnne.

Vll. weiß ja jemand eine Möglichkeit das zu unterbinden.

Vielen Dank,
Benjamin

Den Code, den ich verwende, habe ich hier irgendwo gefunden und eventuell leicht abgeändert.
Delphi-Quellcode:
procedure TFileMonitorThread.Execute;
var
  pBuf : Pointer;
  dwBufLen : DWORD;
  dwRead : DWORD;
  FNI : FILE_NOTIFY_INFORMATION;
  pWork : Pointer;
  sFileName : Widestring;

begin
  Self.FreeOnTerminate:=True;
  FhFile := CreateFile(PChar(FsDirPath),FILE_LIST_DIRECTORY or GENERIC_READ,
              FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil,
              OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);
  if (FhFile = INVALID_HANDLE_VALUE) or (FhFile = 0) then
  Begin
    Self.Terminate;
    exit;
  End;
  dwBufLen := 65536;
  pBuf := AllocMem(dwBufLen);
  try
    while not terminated do begin
      if ReadDirectoryChangesW(FhFile,pBuf,dwBufLen,true,
                                FILE_NOTIFY_CHANGE_FILE_NAME or
                                FILE_NOTIFY_CHANGE_DIR_NAME or
                                FILE_NOTIFY_CHANGE_LAST_WRITE,
                                @dwRead,nil,nil) then
      begin
        pWork := pBuf;
        repeat//Ich vermute hier bleibt's stecken
          StrMove(@FNI,pWork,12);
          PChar(pWork) := PChar(pWork)+12;
          sFileName := StringOfChar(#00,FNI.dwFileNameLength);
          StrMove(@sFileName[1],pWork,FNI.dwFileNameLength);
          FsFileName := WideCharToString(PWideChar(sFileName));
          FsFileName := copy(FsFileName,1,length(FsFileName) shl 1);
          dwReason := FNI.dwAction;//GetReason(FNI.dwAction);
          Synchronize(AddReasonToMemo);
          Synchronize(AddFileToMemo);
          PChar(pWork) := PChar(pBuf)+FNI.dwNextEntryOffset;
        until (FNI.dwNextEntryOffset = 0) or (terminated);
      end else begin
        break;
      end;
    end;
  finally
    FreeMem(pBuf,dwBufLen);
  end;
end;
Benjamin
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: ReadDirectoryChangesW endet in einer Endlosschleife

  Alt 20. Mär 2007, 18:53
Moin Benjamin,

der Code kommt mir so bekannt vor


Ich weiss, dass ich da irgendwo einen Schnitzer drin hatte.
Probier's mal mit

Delphi-Quellcode:
ZeroMemory(@FNI,SizeOf(FNI));
CopyMemory(@FNI,pWork,dwRead);
sResult := trim(WideCharLenToString(@FNI.wFilename[1],FNI.dwFileNameLength));
PChar(pWork) := PChar(pWork)+FNI.dwNextEntryOffset;
im repeat/until, natürlich um das was Du brauchst ergänzt.
Wo der Thread in der Endlosschleife hängenbleibt kannst Du übrigens wohl recht schnell ermitteln, wenn Du es mal im Einzelschritt durchgehst. Ausserdem kannst Du auch einfach mal ein oder mehrere OutputDebugString, dann kannst Du Dir den Ablauf anschliessend noch einmal anschauen. (View\Debug Windows\Event Log)
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
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: ReadDirectoryChangesW endet in einer Endlosschleife

  Alt 21. Mär 2007, 17:32
Ja, funktioniert.
Danke!
Benjamin
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:27 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