In meinem Programm kann der User eine Berechnung starten, die wegen ihrer Komplexität durchaus auch mal mehrere Minuten dauern kann.
Dem User wird in der Zeit in einem modalen Dialog ein Fortschrittsbalken angezeigt. Dieser Dialog enthält auch einen Abbrechen-Button.
Die Berechnungs-Routine wird aus der Dialogsteuerungsklasse heraus als Thread gestartet, mit _beginthread. Wenn der User den Abbrechen-Button klickt, so wird der Thread gekillt, mit CloseHandle().
In der Funktion, die als Thread gestartet wird, wird eine andere Funktion aufgerufen, die dann rekursiv die Berechnung durchführt. Das nimmt im Taskmanager für die Dauer der Berechnung dann 99% der CPU-Leistung ein.
Wenn der Abbruch-Button in dem Fortschritts-Dialog geklickt wird, dann endet zwar die Dialogsteuerung, jedoch bleibt die CPU-Auslastung bei 99%. Das heißt dass im Hintergrund die Berechnung „im geheimen“ weiter läuft, obwohl diese gestoppt werden sollte.
Ich dachte bisher, dass wenn ein Thread mit CloseHandle gestoppt wird, dadurch auch alle Aufrufe die aus diesem Thread heraus erfolgt sind, als Prozess gestoppt werden. Das ist aber ganz offensichtlich nicht so.
Wo liegt also bitte der Trick, der dazu führt, dass mit dem Killen der Dialog-Steuerung (Fortschritts-Balken-Dialog) auch die aus diesem Dialog heraus aufgerufenen Funktionen ihre Abarbeitung auch sofort einstellen ?
Bisher ist es so, dass dieser „geheime“ weiterlaufende Prozess (der wie gesagt sich dann weiterhin 99% CPU heraus nimmt) erst mit der Beendigung des gesamten Programms auch aufhört. Das darf nicht sein.