Anwendung schließen obwohl noch Threads "an" sind?
-
Guten Abend,
dies ist ein Post nach dem Motto: "erst posten, dann denken"
Desshalb möchte ich mich für etwaige überschneidung mit schon vorhandenen Themen im Voraus entschuldigen.Zur Frage:
Ich habe Threads (sagen wir mal 10) von diesen sind 3 fertig, die anderen 7 aber nicht.
Wenn man nun die Anwendung einfach so schließt werden die Threads dann ordungsgemäß "geschlossen" oder einfach gekillt? Ich meine damit ob ich bei einer MultiThreaded Anwendung vor dem beenden mit Waitforsingleobject() prüfen _muss_ ob noch irgentein Thread "an" ist oder ob sich das schon von alleine regelt??Mfg Fredd
-
AFAIK unterscheidet sich der Anfangsthread nicht von den anderen, es gibt keine Hierarchie.
Das heißt wenn der Hauptthread ausläuft, dann sind die anderen Threads davon ziemlich unbeeindruckt und laufen weiter. Höchstwahrscheinlich greifen sie dann auf nicht mehr existenten Speicher zu.Du musst also dafür sorgen, dass beim Beenden des Hauptthreads kein anderer Thread mehr läuft.
p.s.: Hmmm... vielleicht ist es auch so, dass beim Beenden des Hauptthreads der komplette Speicher, also auch die Code-Bereiche freigeben werden. Das ist aber eigentlich egal, wie es wirklich ist, denn wenn der Hauptthread ausläuft und noch andere Threads laufen, stürzt das Programm ab.
-
Beim BCB sollten alle Threads terminiert werden, bevor das Programm stoppt. Sonst hagelt es Fehlermeldungen, wenn der Thread im Speicher weiterarbeitet!
Bei anderen Compilern sollte man doch auch davon ausgehen.
-
Sobald der Prozeß, der alle Threads beinhaltet (jeder Prozeß hat mindestens einen Thread; ein Prozeß führt niemals Code aus) endet, werden alle Threads beendet.
...da ALLE eure Programme mindestens einen Thread haben, erlaubt mir eine Frage:
Kümmert ihr Euch darum, auf das Ende dieses einen Threads zu warten, wenn Eure Anwendung beendet wird? Ich glaube nicht...Was anderes ist es, wenn man einem Thread mit TerminateThread() die Beine wegtritt...
-
Sorry, aber die Logik verstehe ich jetzt nicht so ganz

Bei einen "normalen" Single-Thread Programm läuft der Thread doch ganz normal aus
Und wie sollte man in diesem Thread auf sich selbst warten

-
Hepi schrieb:
..Kümmert ihr Euch darum, auf das Ende dieses einen Threads zu warten, wenn Eure Anwendung beendet wird? Ich glaube nicht...
...Ich schon! In einem meiner Programme sucht ein Thread die Festplatten durch und trägt Dateinamen in eine ListBox ein. Wenn der Thread laueft bei Programmende, gibts Exceptions
. Wenn ich den Thread vor Beenden des programms terminiere gibt's keine Probleme mehr! 
ALSO MACH ICH DAS VORSICHTSHALBER MIT ALLEN THREADS!
Das Problem hatte ich auch noch beim Laden mehrerer Bilder in eine Uebersicht - mit Thread!
PS: Moeglich, dass das ein BCB- typisches Verhalten ist.
-
DerAltenburger schrieb:
Wenn ich den Thread vor Beenden des programms terminiere gibt's keine Probleme mehr!
Ich hoffe du meinst damit nicht TerminateThread().
-
[quote="cd9000Ich hoffe du meinst damit nicht TerminateThread().[/quote]
Neee, nur: Terminate(); //Ist ne BCB- Funktion des Thread- Objektes!
PS: Das mach ich NICHT mit dem Haupt- Thread!
-
flenders schrieb:
Sorry, aber die Logik verstehe ich jetzt nicht so ganz

Bei einen "normalen" Single-Thread Programm läuft der Thread doch ganz normal aus
Und wie sollte man in diesem Thread auf sich selbst warten

Eben, flenders!
Und nun schau Dir nochmal das hier an:
DerAltenburger schrieb:
Beim BCB sollten alle Threads terminiert werden, bevor das Programm stoppt.
..."alle" Threads? Hmm?
-
"Alle" Threads, die neben dem Hauptthread gestartet wurden, falls diese nicht selbst terminieren - beim BCB geht das auch.
-
Ich hab das Ganze mal mitverfolgt. Wenn ich richtig orientiert bin, dann hat doch jeder Prozess seinen eigenen Prozessraum, in dem dann auch die "Unterthreads" mitlaufen, die von dem "Hauptthread" gestartet wurden. Folglich, wenn ich den Prozess beende, wird der Prozessraum gelöscht, oder freigeben, und damit auch alle enthaltenen anderen Threads.
Was aber für mich nun noch nicht so ganz zu Tage getreten ist, ist die Frage: Macht es nun Sinn alle Unterthreads zu beenden bevor man ein Programm beendet oder reicht es vollkommen aus, wenn man das nur bei kritischen Threads macht, die z.B. Schreibop's auf die Festplatte machen?
Allerdings ist es doch unsauber, wenn man es nicht bei allen Threads macht. Beim BCB springt dann der CodeGuard an und schreibt dann die offenen Ressourcen in eine Textdatei.Also was ist ratsam?
-
Ich würde sagen, es ist das Sauberste, wenn du dafür sorgst, dass alle Threads ordentlich "auslaufen"

-
DerAltenburger schrieb:
Neee, nur: Terminate(); //Ist ne BCB- Funktion des Thread- Objektes!
Was wird Terminate() schon anderes machen als TerminateThread aufzurufen?
Hast du keine BCB-Doku?

Ich habe keinen BCB, aber ich vermute sehr stark dass in der Doku steht, man darf Terminate nur in absoluten Ausnahme-Fällen nutzen und nie standardmäßig um überflüssige Threads abzuschießen.
Wie flender eben gesagt hat, es ist viel besser die Threads auslaufen zu lassen. Du kannst ja eine Variable (Event, Mutex, was auch immer) verwenden. Diese Variable wird regelmäßig von den Threads gecheckt; wenn sie gesetzt ist beenden sich die Threads. Gesetzt wird sie, wenn der Hauptthread aufhören will.
-
cd9000 schrieb:
Du kannst ja eine Variable (Event, Mutex, was auch immer) verwenden.
Da reicht auch ein ganz normaler kleiner BOOL-Zeiger, der Haupt- und Unterthread bekannt ist.
-
Nur dass man dann darauf im Haupt-Thread nicht so effizient warten kann

-
flenders schrieb:
Nur dass man dann darauf im Haupt-Thread nicht so effizient warten kann

Das nicht, aber _beginthreadex liefert einen Handle auf das ThreadObjekt zurück, auf das man dann mit WaitForSingleObject/WaitForMultipleObjects warten kann...
Also z. B. so:
iMaxThreads = 10; HANDLE hThread[10]; BOOL bThreadLaeuft[10]; . . . case WM_CLOSE: for(i=0; i < iMaxThreads; i++) { if(bThreadLaeuft[i]) { WaitForSingleObject(hThread[i], INFINITE); CloseHandle(hThread[i]); } } return 0;
-
Auch wahr

-
cd9000 schrieb:
DerAltenburger schrieb:
Neee, nur: Terminate(); //Ist ne BCB- Funktion des Thread- Objektes!
Was wird Terminate() schon anderes machen als TerminateThread aufzurufen?
Terminate() im BCB setzt eine (innere) Variable Terminated auf true. Die sorgt i.a. fuer das auslaufen des Thread! (Falls der ordentlich programmiert ist!)

-
DerAltenburger schrieb:
Terminate() im BCB setzt eine (innere) Variable Terminated auf true. Die sorgt i.a. fuer das auslaufen des Thread! (Falls der ordentlich programmiert ist!)

Was heißt "ordentlich programmiert"?
-
cd9000 schrieb:
Was heißt "ordentlich programmiert"?
Der Thread sollte die Variable Terminated testen und, falls die true ist, auslaufen.
Beim BCB kann sich der Thread dann auch aus Speicher freigeben (FreeOnTerminate)