ReadDirectoryChangesW: wie sauber beenden?
-
Hallo,
ich habe eine Schleife in einen Thread ausgelagert, die auf Änderungen innerhalb eines Ordners (synchron) reagiert:while(ReadDirectoryChangesW(m_hDir...) { /* tu irgendwas */ }Frage: wie beende ich das dann jetzt am besten (wenn mein Programm sich beenden soll)? Denn ReadDirectoryChangesW blockt ja.
Ein Aufruf (außerhalb des Threads) von CloseHandle(m_hDir) bringt nichts. Das einzige was geht ist ein CloseHandle(m_hDir), gefolgt von irgend einer Aktion in dem Ordner. Also wenn ich jetzt in dem Ordner ne Datei anlege, nachdem ich CloseHandle(m_hDir) aufgerufen habe, beendet sich diese Funktion.
Aber es muss doch irgend eine andere Möglichkeit geben, oder?Danke im Voraus!
MfG
-
Wenn du den Thread beenden willst kannst du
BOOL WINAPI TerminateThread( HANDLE hThread, DWORD dwExitCode );hernehmen!
-
TerminateThread ist wohl grundsätzlich die unsauberste Methode einen Thread zu beenden.
ReadDirectoyChangesW blockiert nur, wenn Du nicht Overlapped I/O verwendest. Und genau das soltest Du aber machen!
Selbst wenn dies teilweise MFC Code ist wird das Prinzip an diesem Beispiel klar:
http://www.codeproject.com/file/directorychangewatcher.asp
-
Was ist an TerminateThread() unsauber ??
-
XBert schrieb:
Was ist an TerminateThread() unsauber ??
Weil es den entsprechenden Thread abschießt, ohne ihm irgendeine Chance für Aufräumarbeiten zu bieten (da sind potentieelle Speicherlecks wohl dein kleinstes Problem) - sowas macht man nur, wenn alle anderen Möglichkeiten gescheitert sind.
-
Hallo!
Danke für die fixen antworten :).
@XBert: Just 4 fun hatte ich davor das mal so gemacht, habe das Handle von _beginthread() an Terminate Thread übergeben, lustigerweise hat sich der Prozess immer noch nicht beendet :D. Abgesehen davon möchte ich schon sauber bleiben :).
@Martin: Ja, ich hatte es erst overlapped mit der completion-port-Methode, allerdings hatte ich den Eindruck, dass bei vielen Dateioperationen hier einige Nachrichten verschluckt werden. Das war sicherlich ein Programmierfehler meinerseits. Ich werds dann mal wieder so machen und nach dem Fehler suchen, wenn ich nicht damit zurechtkomme meld ich mich wieder
.MfG
-
@ CStoll:
danke ich habs auch gerade in einem andern Beitrag gelesen (wusst ich ned)
-
Ich bin zwar kein WinAPI-Experte, aber sollte es nicht reichen, ein Event zu erstellen, welches ausgelöst wird, wenn der Thread beendet werden soll?
Man kann dann mittels WaitForMultipleObjects auf Änderungen am Filesystem und auf den Event warten.
-
Wenn dein Programm sich eh beendet, sind irgendwelche Speicherlecks auch egal, weil der Speicher deines Prozesses dann eh freigegeben wird vom Betriebssystem. Und da du keine kritischen Funktionen verwendest, ist TerminateThread an dieser Stelle nicht so fatal, wie einige es darstellen.
-
Joe_M. schrieb:
Ich bin zwar kein WinAPI-Experte, aber sollte es nicht reichen, ein Event zu erstellen, welches ausgelöst wird, wenn der Thread beendet werden soll?
Man kann dann mittels WaitForMultipleObjects auf Änderungen am Filesystem und auf den Event warten.Ja so hätte ich es auch gemacht.
-
SkriptProfessor schrieb:
Wenn dein Programm sich eh beendet, sind irgendwelche Speicherlecks auch egal
Mit der Einstellung kannst du eventuell an kleine Fun-Anwendungen herangehen - in "echten" Anwendungen ist sowas tödlich (btw, Speicher ist nicht das einzige, was bei so einem erzwungenen Absturz zurückbleibt).
-
SkriptProfessor schrieb:
Wenn dein Programm sich eh beendet, sind irgendwelche Speicherlecks auch egal, weil der Speicher deines Prozesses dann eh freigegeben wird vom Betriebssystem. Und da du keine kritischen Funktionen verwendest, ist TerminateThread an dieser Stelle nicht so fatal, wie einige es darstellen.
Dann ist TerminateThread immer noch schlechter, als den Prozess zu beenden. Wen man TerminateThread aufruft und der Thread gerade eine CRT Ressource verwendet läuft nicht einmal mehr das beenden des Programmes.
Dann lieber einfach den Thread, Thread sein lassen und das Programm verlassen, das ist immer noch sauberer als TerminateThread zu verwenden.
-
Nagut da hast du Recht Martin.