ich bastle gerade an einem Programm, in welchem ich threading nutze.
Da ich das zum ersten Mal nutze, bin ich mir bei einigen Sachen noch sehr unsicher.
Das Ganze ist innerhalb einer GUI, die aber für mein Problem bzw. meine Fragen nicht wichtig ist. Deshalb poste ich es auch nicht ins GUI-Forum.
Ich habe die Programm-Teile rausgesucht, weil da wirklich viel dabei ist, was für meine Fragen irrelevant ist.
1. Klassendefinition mit Konstruktor:
Code: Alles auswählen
class Hauptfenster(tk.Frame):
def __init__(self, parent):
self.parent = parent
self.abbruch_event = threading.Event()
self.thread_event = threading.Event()
self.Initialize_user_interface()
2. Starten einer Funktion namens rechteck_kurs:
Code: Alles auswählen
def Start(self):
# sicherstellen, dass bei mehrmaligem Start-Drücken
# nicht mehrere Durchläufe/Threads parallel gestartet werden
if threading.active_count() < 2:
self.thread_event.set()
self.thread_kurs = threading.Thread(target=vk.rechteck_kurs, args=(self.thread_event, self.abbruch_event, ))
# falls man einen Neustart machen möchte, ist das notwendig,
# da sonst abbruch_event konstant auf True ist
self.abbruch_event.clear()
self.thread_kurs.start()
3. rechteck_kurs-Funktion:
Code: Alles auswählen
# ----- Rechteck-Kurs -----
def rechteck_kurs(event, abbruch):
while event.is_set():
# Start bei (x,y,z) = (0,0,0)
x = 0
y = 0
while y < 16:
y += 1
if not event.is_set():
# ... macht irgenwas (unwichtig für threading)
event.wait()
if abbruch.is_set():
exit()
time.sleep(1)
# es folgen noch weitere while-Schleifen, die aber ähnlich bzw. genauso aufgebaut sind
4. Beenden des Threads:
Code: Alles auswählen
def Abbruch(self):
if not self.thread_event.is_set():
mb.showinfo("E-Stop aktiv", "Ein E-Stop muss erst aufgehoben werden.")
else:
self.abbruch_event.set()
# Selbsttest 1
print(threading.active_count())
print(threading.enumerate())
self.thread_kurs.join()
# Selbsttest 2
print(threading.active_count())
print(threading.enumerate())
Nun zu meiner Frage:
Bevor ich "Start" drücke, bekomme ich für
Code: Alles auswählen
print(threading.active_count())
print(threading.enumerate())
[<_MainThread(MainThread, started 7164)>]
Bei Selbsttest 1 bekomme ich dann:
3
[<_MainThread(MainThread, started 7408)>, <Thread(Thread-1, started daemon 5856)>, <Thread(Thread-2, started 8144)>]
Bei Selbsttest 2 bekomme ich:
2
[<_MainThread(MainThread, started 7408)>, <Thread(Thread-1, started daemon 5856)>]
Wenn ich dann das Hauptfenster schließe, bekomme ich ganz normal:
[Finished in 121.468s]
(Ich nutze Atom.)
Nun zu meinen Fragen:
Offenbar wird der Thread thread_kurs nach diesem .join() beendet. Ist das so überhaupt Best Practice zum Beenden eines Threads?
Was ist dieses daemon? Ich habe in der Dokumentation nachgelesen:
https://docs.python.org/3/library/threa ... ead.daemon
Aber habe das nicht wirklich verstanden.
Und wieso ist dieses daemon noch da, wenn ich den Thread eigentlich beendet habe und nur noch der MainThread da sein sollte?
Ist das schlimm?
Wenn ich meinen Code so lese, habe ich nicht das Gefühl, dass das alles so richtig schön geschrieben ist und ich bin auch noch am optimieren, aber bisher klappt alles, was klappen soll. Mein Anspruch ist aber, dass es "schön" geschrieben ist und funktioniert. Über Anmerkungen diesbezüglich freue ich mich auch.

Danke an die, die sich Zeit genommen haben, das alles zu lesen.
Über Hilfe würde ich mich sehr freuen.

Liebe Grüße,
Marc