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/)
-   -   ReadDirectoryChangesW beenden (https://www.delphipraxis.net/163721-readdirectorychangesw-beenden.html)

sportkeks 13. Okt 2011 09:52

ReadDirectoryChangesW beenden
 
Hallo DP.
Ich habe ein Problem mit ReadDirectoryChangesW.
Ich habe hier eine Komponente gefunden die wunderbar funktioniert allerdings lässt sie sich nicht korrekt beenden das Programm bleibt einfach nur hängen.
Ich habe es genauso gemacht wie es "Ganymed" in dem Thread auch beschieben hat und bekomme die gleichen Probleme :wall:

Please Help :coder:

Ps. Ich benutze Turbo Delphi und an sich brauche ich auch nur ein Event das sagt das sich etwas geändert hat die Änderung im spezielllen ist nicht wichtig.

Gruß
Sportkeks

sportkeks 18. Okt 2011 18:51

AW: ReadDirectoryChangesW beenden
 
Und push :bounce1:

himitsu 18. Okt 2011 21:13

AW: ReadDirectoryChangesW beenden
 
Teilst du diesem Thread auch mit, daß er sich beenden soll, bzw. wie/wo gibst du die Thread-Instanz frei?

sportkeks 21. Okt 2011 18:15

AW: ReadDirectoryChangesW beenden
 
Die Thread Instanz wird in der Komponente frei gegeben sobalt TFldrControl.StopThread aufgerufen wird. Das ganze sieht dann bei mir so aus:

Delphi-Quellcode:
  oFolderControler:TFldrControl;


procedure TForm1.Change(Folder: String; Action: Integer);
begin
  Memo1.Lines.Add(Folder+' '+inttostr(Action));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  oFolderControler.StopThread;
  oFolderControler.Free;
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  oFolderControler := TFldrControl.Create(Owner);
  oFolderControler.Folder := 'D:\Test';
  oFolderControler.OnGetResult := change;
  oFolderControler.StartThread;
end;
Beim stoppen tritt eine Zugiffsverletzung auf:

Delphi-Quellcode:
destructor CtrlThread.Destroy;
begin // diverse Handles freigeben
  try
    if FhFile <> INVALID_HANDLE_VALUE then CloseHandle(FhFile);
       CloseHandle(FileEvent); <---------------------- hier kommt ein exception
    TermEvent.Free;
    SuspEvent.Free;
  except
  end;
end;
Kann das jemand anders vllt mal testen, oder kann mir jemand sagen wie ich einen Thread der bei "ReadDirectoryChangesW(...)" auf eine antwort wartet, also bis eine Datei verändert wird, "weiter laufen" lassen kann ohne das eine Datei verändert wird ?

Hier ein Beispiel:

Delphi-Quellcode:
    while not terminated do begin
      if ReadDirectoryChangesW(FhFile,pBuf,dwBufLen,true, <------- |Der Thread wartet hier solange
                                FILE_NOTIFY_CHANGE_FILE_NAME or ---|bis eine Datei geändert wird egal
                                FILE_NOTIFY_CHANGE_DIR_NAME or ----|ob man ihn terminiert, er bleibt
                                FILE_NOTIFY_CHANGE_LAST_WRITE, ----|hier stehen....
                                @dwRead,nil,nil) then
      begin
        Synchronize(proc);
      end
      else
      begin
        break;
      end;
    end;
Ich hoffe Ihr wisst was ich meine :cyclops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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