![]() |
"FindFirstChangeNotifikation" neu anstoßen
hoi,
ich benutze folgenden Funktion in einem thread. (die Funktion habe ich von ![]()
Delphi-Quellcode:
Problem: Ich weiß nicht wie ich es umsetzen muss damit die funktion weiterarbeitet nachdem z.B.
function RegisterDirectoryWatch(Params:Pointer): Boolean;
var hHnd : THandle; dwWait : DWORD; Parameter : TThreadParameter ; begin Parameter := PThreadParameter(Params)^ ; Dispose(PThreadParameter(Params)); Result := False ; if (Parameter.Pfad <> EmptyStr) then // bei gueltiger Pfadangabe ... begin hHnd := FindFirstChangeNotification ( PChar(Parameter.Pfad), // Pfad False, // keine Unterverz. FILE_NOTIFY_CHANGE_FILE_NAME); // Flag if hHnd = INVALID_HANDLE_VALUE then // bei Fehler -> Abbruch begin Result := False; end else begin while TRUE do // warte begin dwWait := WaitForSingleObject(hHnd, INFINITE); case dwWait of WAIT_OBJECT_0: // hab was gefunden begin if FileExists( Parameter.Pfad + Datei) then // ist die eine datei vorhanden ? begin SuspendThread(MyThreadID) ; // thread unterbrechen //... // weitere Verarbeitung //... DeleteFile( Parameter.Pfad + Datei); // datei loeschen if ThreadStoppen then // threadstoppen = boolean ; wird global gesetzt Exit else begin // ... // weiter schauen <---- wie gehts weiter ? die suche soll weiter gehen // ... ResumeThread(MyThreadID); end; end; end; end; end; end; FindCloseChangeNotification(hHnd) ; end; end; einmal die Datei gefunden wurde. Ich will "nur" ein neues anstoßen bewirken. cya |
AW: "FindFirstChangeNotifikation" neu anstoßen
Delphi-Quellcode:
FindFirstChangeNotification richtet die Üerwachung ein,
FindFirstChangeNotification
while WaitForSingleObject Auswerten end; FindCloseChangeNotification WaitForSingleObject wartet auf das nächste Ereignis (oder ein Timeout) und FindCloseChangeNotification hebt den Benachrichtigungsauftrag auf. Zitat:
Genau ... nichts, außer die Schleife fortzusetzen, bzw. nicht abzubrechen. |
AW: "FindFirstChangeNotifikation" neu anstoßen
hallo himitsu,
wenn ich die schleife mit "continue" weiterarbeiten lassen funktionierts aber es steht ein Kern bei mir konstant auf 50% Last. Hängt das zufällig mit dem "Infinite" bei "WaitForSingleObject" zusammen oder habe ich noch was vergessen ? |
AW: "FindFirstChangeNotifikation" neu anstoßen
Moin Soulies,
bei einer Funktion, die was mit First heisst, und mit Close beendet wird, es auch eine mit Next geben, in diesem Falle: ![]() Schau Dir mal folgendes Beispiel an. Dazu benötigst Du einen Formular, und zwei Button, der Rest steht (hoffentlich ;-)) drin.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TcsDirWatchThread = class(TThread) private FsDirToWatch : string; procedure MyShowMessage; public constructor Create(const AsFolder : string); procedure Execute; override; end; type TfrmMain = class(TForm) btnResume: TButton; btnSuspend: TButton; procedure btnResumeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnSuspendClick(Sender: TObject); private { Private declarations } FDWT : TcsDirWatchThread; public { Public declarations } end; var frmMain: TfrmMain; implementation {$R *.dfm} { TcsDirWatchThread } constructor TcsDirWatchThread.Create(const AsFolder: string); begin inherited Create(true); if not DirectoryExists(AsFolder) then raise Exception.CreateFmt('Datei %s nicht gefunden.',[AsFolder]); FsDirToWatch := AsFolder; end; procedure TcsDirWatchThread.Execute; var dwFCN : DWORD; begin dwFCN := FindFirstChangeNotification(PChar(FsDirToWatch),false,FILE_NOTIFY_CHANGE_FILE_NAME); if dwFCN = INVALID_HANDLE_VALUE then raise Exception.CreateFmt('FindFirstChangeNotification fehlgeschlagen.'#13#10'FM: %s',[SysErrorMessage(GetLastError)]); try while not Terminated do begin case WaitForSingleObject(dwFCN,1000) of WAIT_OBJECT_0 : begin // Mach was mit der Meldung Synchronize(MyShowMessage); end; end; FindNextChangeNotification(dwFCN); end; finally FindCloseChangeNotification(dwFCN); end; end; procedure TcsDirWatchThread.MyShowMessage; begin ShowMessage('Ausgelöst'); end; procedure TfrmMain.btnResumeClick(Sender: TObject); begin FDWT.Resume; end; procedure TfrmMain.FormCreate(Sender: TObject); begin FDWT := TcsDirWatchThread.Create('C:\temp'); end; procedure TfrmMain.FormDestroy(Sender: TObject); begin FDWT.Terminate; FDWT.Free; end; procedure TfrmMain.btnSuspendClick(Sender: TObject); begin FDWT.Suspend; end; end. |
AW: "FindFirstChangeNotifikation" neu anstoßen
hallo christian,
Zitat:
Das Problem was ich dann aber habe ist nachdem ich "Execute" aufgerufen habe, der Thread zwar läuft aber das Programm an sich "eingefroren" ist. Auf Änderungen im Verzeichnis wird korrekt reagiert. PS. Ich habe "Execute" nach dem "Create" aufgerufen cya |
AW: "FindFirstChangeNotifikation" neu anstoßen
Du darfst Execute gar nicht aufrufen.
Das ist ein Thread, der läuft alleine :D Gruss |
AW: "FindFirstChangeNotifikation" neu anstoßen
hallo,
Zitat:
cya |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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 by Thomas Breitkreuz