AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi RegisterWaitForSingleObject - wie richtig benutzen?
Thema durchsuchen
Ansicht
Themen-Optionen

RegisterWaitForSingleObject - wie richtig benutzen?

Ein Thema von SnuffMaster23 · begonnen am 3. Jan 2008 · letzter Beitrag vom 4. Jan 2008
Antwort Antwort
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#1

RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 3. Jan 2008, 14:28
Delphi-Quellcode:
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)
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...
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 3. Jan 2008, 15:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#3

Re: RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 3. Jan 2008, 15:35
Nein hab ich wohl nicht

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.
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 3. Jan 2008, 15:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#5

Re: RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 3. Jan 2008, 16:25
Ich hol eigentlich noch garnix von Windows ab, bisher steht nur beep; im Callback
Macht natürlich auch Sinn dass ichs erst abholen muss bevors Ruhe geben kann
Ich setz mich mal mit dem abholen auseinander...

//Edit: hm, wie hol ich ab? Mit ReadDirectoryChangesW scheints nicht zu funktionieren
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 3. Jan 2008, 20:05
Hmm. Ok, ich habe die Funktion noch nie verwendet. Ich habe mal in der MSDN mir das Beispiel dazu angeschaut und das kann man doch leicht zu Delphi umsetzen wobei das WaitForMultipleObjects() in einem Thread gepackt werden kann. Damit solltest du dein Problem doch auch lösen können. Dein bisheriger Weg hat zum Unterschied nur die Einsparung des Threads, da Windows den Thread statt dessen laufen lässt und dich aus diesem dann aufruft.
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#7

Re: RegisterWaitForSingleObject - wie richtig benutzen?

  Alt 4. Jan 2008, 14:25
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 hier gemopst
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  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 12:03 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