Mehrere Threads beenden - Verständnisproblem?!!?
-
Hallo @all,
ich hab mir ein kleines Programm geschrieben, welche insgesamt 7 Threads startet und innerhalb der Threads werden verschiedene Webseiten nach bestimmten Schlagworten durchforstet...nachdem ich die Threads gestartet habe tun diese wie von mir gewollt ihren Dienst. Möchte ich die Threads nun beenden indem ich eine globale Steuervariable bEndThreads auf true setze, werden sporadisch mal 3, mal 5 oder mal 6 Threads beendet, jedoch nie alle 7.
Ich sollte vielleicht noch erwähnen, dass ich die Anzahl der Threads innerhalb eines jeden Threads einmal zu beginn inkrementiere...
... UINT WorkerThread(LPVOID param) { ... CSingleLock singleLock(&myCriticalSection); singleLock.Lock(); { iRunningThreads += 1; } singleLock.Unlock(); ... while(bEndThreads == false) { // ... durchforste Internetseiten... } singleLock.Lock(); { iRunningThreads -= 1; } singleLock.Unlock(); return 0; } ... ... void CMeinDialog::OnCancelButton() { //Threads anweisen sich zu beenden bEndThreads = true; //Bevor das Programm beendet werden kann, //müssen alle Threads beendet sein while(iRunningThreads > 0) { Sleep(1); } CDialog::OnCancel(); }
habe ich einen groben Denkfehler gemacht?? oder warum klappt es nicht? vielleicht kann mir ja eine(r) von euch sagen, warum es auf diese Art nicht funktioniert...
danke schon mal im Voraus
-
kann mir denn niemand helfen??
-
Kannst du den genauen Fehler eventuell etwas eingrenzen? Ignorieren deine Threads die Abbruchbedingung? Oder macht das Hauptprogramm schon weiter, obwohl noch Worker-Threads laufen?
Eine Vermutung ist: Du solltest in deiner while-Schleife (ist die überhaupt nötig für die Abarbeitung?) ein paar Abbruchtests ("if(bEndThreads) break;") einbauen.
-
Und bEndThreads solltest du auch Schützen.
Bist du sicher das sie aus der Schleife gehen und nicht einfach eine Exeption werfen wenn du in die bEndThreads schreibst?
-
@unix-tom:
nee, eine Exception wird nicht geworfen...und bEndThreads wird in den Threads ja nur ausgelesen...von daher denke ich nicht, dass sie geschützt werden müsste@CStoll:
nun, wenn ich bEndThread auf true setze, scheint das gesamte Programm hängen zu bleiben...ich habe mit TRACE(...) versucht zu prüfen, ob die while-Schleife verlassen wird - wie bereits gesagt, verlassen einige der Threads die while-Schleife und andere wiederum nicht.wenn ich bEndThreads auf true setze und anschließend die Funktion
::WaitForSingleObject(...)
aufrufe, verlassen komischerweise alle Threads die while-Schleife und das Programm bleibt NICHT hängen und ich kann es ohne Probleme beenden.
Trotzdem würde ich gerne verstehen, warum dem so ist
bzw. warum meine Variante nicht funktioniert