![]() |
RegisterWaitForSingleObject - wie richtig benutzen?
Delphi-Quellcode:
Es funktioniert schonmal dass ich Änderungen im überwachten Verzeichnis mitkrieg, nur der Haken an der Sache ist, die Callback-Funktion wird immer und immer wieder aufgerufen sobald einmal was passiert is...
type
TfnWaitOrTimerObject = procedure(lpParameter: pointer; TimerOrWaitFired: ByteBool); stdcall; function RegisterWaitForSingleObject( var hNewWaitObject: THandle; hObject: THandle; callback: TfnWaitOrTimerObject; context: Pointer; dwMilliseconds: DWORD; dwFlags: DWORD): BOOL; stdcall; external 'kernel32.dll'; . . . TheHandle := FindFirstChangeNotification(PChar(pathEdit.Text), subdirCheckBox.Checked, FILE_NOTIFY_CHANGE_LAST_WRITE); RegisterWaitForSingleObject(TheHandle, TheHandle, UploadFile, nil, INFINITE, 0) |
Re: RegisterWaitForSingleObject - wie richtig benutzen?
Hast du diesen Passus beachtet?
MSDN Note that you should not pulse an event object passed to RegisterWaitForSingleObject, because the wait thread might not detect that the event is signaled before it is reset. You should not register an object that remains signaled (such as a manual reset event or terminated process) unless you set the WT_EXECUTEONLYONCE or WT_EXECUTEINWAITTHREAD flag. For other flags, the callback function might be called too many times before the event is reset. Weil wenn der Status danach immernoch signaled ist, dann wirst du sofort wieder aufgerufen. |
Re: RegisterWaitForSingleObject - wie richtig benutzen?
Nein hab ich wohl nicht :D
Aber mit WT_EXECUTEONLYONCE springts auch wirklich nur einmal an, ich kanns (jedenfalls mit der gleichen Datei) kein zweites Mal auslösen. FindNextChangeNotification in der Callback-Funktion hilft auch nicht. |
Re: RegisterWaitForSingleObject - wie richtig benutzen?
Grundlegend muss das Event zurück gesetzt werden, bevor du den Callback wieder verlässt. Somit musst du im Callback alle angefallenen Verzeichnisänderungen abfragen und erst dann darfst du zurück kehren. Ich hoffe dass du das so machst und dir nicht im Callback ein Flag vermerkst um dann an anderer Stelle die Änderungen von Windows abzuholen.
|
Re: RegisterWaitForSingleObject - wie richtig benutzen?
Ich hol eigentlich noch garnix von Windows ab, bisher steht nur beep; im Callback :D
Macht natürlich auch Sinn dass ichs erst abholen muss bevors Ruhe geben kann :wall: Ich setz mich mal mit dem abholen auseinander... //Edit: hm, wie hol ich ab? Mit ReadDirectoryChangesW scheints nicht zu funktionieren :( |
Re: RegisterWaitForSingleObject - wie richtig benutzen?
Hmm. Ok, ich habe die Funktion noch nie verwendet. Ich habe mal in der MSDN mir das
![]() |
Re: RegisterWaitForSingleObject - wie richtig benutzen?
Joa genau deswegen wollt ich auch RegisterWaitForSingleObject nehmen weils mit dem Thread doch ein bisschen komplizierter wird^^
Das Beispiel kenn ich schon, aber da steht eben die 'manuelle' Methode drin und da wird auch nix abgeholt sondern einfach alles neu ausgegeben. Das Infos Abholen scheint aber wirklich mit ReadDirectoryChangesW zu gehen, ich befass mich nochmal ausführlich damit. Ich brauchs ja sowieso in beiden Varianten. Ich glaub ich pack das hinterher in die CodeLib, weil es is echt nix dazu im Netz zu finden (jedenfalls für Delphi). //Edit: Ich habs jetz doch mit nem extra Thread gemacht und nur mit ReadDirectoryChangesW. Den Code dazu hab ich von ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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