AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CloseHandle kehrt nicht zurück

Ein Thema von Christian Seehase · begonnen am 8. Jan 2006 · letzter Beitrag vom 10. Jan 2006
Antwort Antwort
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#1

CloseHandle kehrt nicht zurück

  Alt 8. Jan 2006, 19:19
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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: CloseHandle kehrt nicht zurück

  Alt 8. Jan 2006, 20:18
Hallo Chris,

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

Grüße vom marabu
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: CloseHandle kehrt nicht zurück

  Alt 8. Jan 2006, 22:20
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: CloseHandle kehrt nicht zurück

  Alt 9. Jan 2006, 22:50
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)?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: CloseHandle kehrt nicht zurück

  Alt 10. Jan 2006, 18:18
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).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: CloseHandle kehrt nicht zurück

  Alt 10. Jan 2006, 21:11
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.
  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 16:34 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