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/)
-   -   Delphi CloseHandle kehrt nicht zurück (https://www.delphipraxis.net/60533-closehandle-kehrt-nicht-zurueck.html)

Christian Seehase 8. Jan 2006 18:19


CloseHandle kehrt nicht zurück
 
Moin Zusammen,

im Konstruktor eines TThread hole ich mir ein Handle auf ein Verzeichnis:

Delphi-Quellcode:
  FhDir   := CreateFile(PChar(FsPath),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);
Dieses wird dann in der Execute-Methode von ReadDirectoryChangesW zur Überwachung des Verzeichnisses verwendet.
(In einer while not terminated do Schleife)

Bis hierhin ist alles gut, und funktioniert wie es soll.

Im Destruktor wird dann das Handle auf Gültigkeit geprüft, und ggf. mit CloseHandle geschlossen.
Soviel zur Theorie, denn CloseHandle kehrt nicht zurück, und das Programm hängt.

Hat irgendjemand eine Idee, was das sein kann?

marabu 8. Jan 2006 19:18

Re: CloseHandle kehrt nicht zurück
 
Hallo Chris,

hast du mal versucht das Handle kurz vor dem Destroy - im Ereignis OnTerminate - freizugeben?

Grüße vom marabu

Christian Seehase 8. Jan 2006 21:20

Re: CloseHandle kehrt nicht zurück
 
Moin Marabu,

danke für die Idee, aber da kommt er gar nicht erst hin :?
Wie ich feststellen konnte, muss das Problem woanders liegen, denn wenn ich auf das CloseHandle verzichte, bleibt er im inherited Destroy hängen :wall:

Olli 9. Jan 2006 21:50

Re: CloseHandle kehrt nicht zurück
 
Eigentlich gibt es nichts an CloseHandle oder den APIs auf denen es basiert, das es blokieren könnte ...
Hast du mal in der boot.ini das Debug-Flag gesetzt und dann ein paar Debugnachrichten plaziert (z.B. vor und nach dem Aufruf von CloseHandle und an anderen strategischen Punkten)?

Christian Seehase 10. Jan 2006 17:18

Re: CloseHandle kehrt nicht zurück
 
Moin Olli,

danke.
Probiert habe ich das mit dem Debug-Flag noch nicht, ich vermute mal, dass ich mir eher etwas mit dem ReadDirectoryChangesW "reingeschossen" habe, denn, wie schon erwähnt, ohne CloseHandle bleibt das Programm beim Beenden des Threads (von TThread abgeleitet) auch hängen. Suspend/Resume hingegen scheint zu funktionieren.
Nach dem Umbau auf FindFirstChangeNotification usw. funktioniert das Ganze jetzt auch problemlos.

Ich werde aber mal ausprobieren, wie sich der Thread verhält, wenn ich ihn über API-Funktionen und nicht über TThread erzeuge.
Immerhin steht der Thread zum genannten Zeitpunkt ja im ReadDirectoryChangesW-Aufruf (synchroner Aufruf, nicht mit Overlapped).

Olli 10. Jan 2006 20:11

Re: CloseHandle kehrt nicht zurück
 
Wäre es aber nicht sinnvoll, wenn du über asynchronen I/O auf die Änderung warten kannst? Wie ich es verstanden habe, ist ja das Handle innerhalb der besagten Funktion noch im Gebrauch, während du es schließt. Aus Treibersicht könnte das dann allerdings auch blocken.

Umgehen könntest du das ganze ja, wenn du mit moderaten Schritten wartest (z.B. auch auf den aktuellen Thread wartest, also über seine Beendigung informiert würdest). Dann müßte es eigentlich möglich sein, CloseHandle normal zu benutzen.

Naja und bei Threads benutze ich persönlich in Delphi auch immer lieber die API-Variante. TThread ist einfach nicht das Gelbe vom Ei.


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