Multi-Threading mit VC++ _beginthread CloseHandle

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.

weiss jetzt auch nicht genau, aber bei ditte soezifische frage gehe mal auf: http://www.c-plusplus.de/forum/

Zerwas

CloseHandle() ist eine WinAPI Funktion, also gehe ich davon aus, das du WinAPI verwendest, obwohl mir das eigenartig vorkommt, da die Windows API meines Wissens keine _beginthread Funktion besitzt. Ich kenn nur CreateThread().
Zum beenden einer Threadfunktion gibt es die Funktion TerminateThread:

BOOL WINAPI TerminateThread(
 \_\_inout HANDLE hThread,
 \_\_in DWORD dwExitCode
);

http://msdn.microsoft.com/en-us/library/ms686717(VS…

Lies dir aber lieber noch die Remarks durch, da diese Funktion sehr gefährlich sein kann. Besser wäre es, du kommunizierst zwischen den Threads, Events oder Signals wie das heißt, ich bin da leider auch kein Profi. Musst du googlen.

mfg dixxi

Hallo Roland

Ich verwenden nie irgendwelche Thread-Funktionen von WIN-API. Ein Vorgang wird bei mir entweder synchron (durch Timer) oder asynchron, z.B. durch Maus oder Tastatur, angetrieben.

Dabei ist wichtig: keine for-Schleifen in einer Funktion, sondern vielmehr „virtuelle Schleifen“ (ich nenne das mal so), d.h. jeder Aufruf der Funktion (aus der Callback) ist „ein [i]“. So kann ich jederzeit eine Var setzen, die den Vorgang beendet, da die Funktion diese abfragt. Beispiel: Maus-Vorgang wird durch WM_LBUTTONUP abgebrochen, oder Texteingabe durch VK_RETURN, bzw. den Timer entfernen.

Ich bin da immer sehr gut damit gefahren, und ist auch gar nicht gefährlich. Ich sehe keinen guten Grund, mich deshalb mit kompliziertem Win-Zeug abzugeben.

lG
Martin B