Thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
stresch89
User
Beiträge: 8
Registriert: Montag 31. Juli 2023, 19:43

Hi,

ich finde keine Lösung zu meinem Problem und hoffe auf Hilfe:

ich starte einen Thread (t) und meine gui (widget.py) aus meinem File (mod.py). Nun versuche ich schon eine ganze Zeit den Thread(t) von der GUI (widget.py) zu stoppen (also mit join()), finde aber nicht wirklich eine Lösung!

mod.py:

Code: Alles auswählen

t = threading.Thread(name="rThread", target=read())
    t = threading.Thread(name="rThread", target=read())
    t.daemon = True
    t.start()

widget.py:

Code: Alles auswählen

for thread in threading.enumerate():
            print (thread.getName())
ich habe schon versucht die ThreadID von mod.py an widget.py zu übergeben (das klappt auch), dann in der widget.py wie in mod.py den Thread wieder "zusammen zu bauen" also t= (id=.....), das klappt aber nicht.

dann habe ich versucht die "Thread-Variable" t global zu setzen (über ein separates Modul), welches ich dann in mod.py und widget.py importiert habe, habe dann so versucht mit join() den Thread zu stoppen, klappt aber auch nicht, vermutlich weil beim Import ja der code im Modul "durchlaufen" wird und in dem Moment t noch nicht definiert ist ?!?

Ich hoffe es versteht jemand mein Problem :-) und kann mir weiterhelfen.

ich sag schon mal danke im voraus.

Gruß Silas
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das Problem wird nicht so wirklich klar. Ausser das `join()` den Thread nicht stoppt, sondern solange wartet bis der endet. Von sich aus. Und das muss er auch, denn Threads kann man nicht von aussen hart stoppen. Man kann nur eine Möglichkeit schaffen, dass man denen mitteilen kann, dass sie sich doch bitte beenden sollen. Zum Beispiel in dem man ein `threading.Event` erstellt und das setzt und der Code der im Thread läuft, fragt das regelmässig ab.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie bei allen anderen Objekten auch, muß man sie als Argument an eine andere Funktion übergeben, wenn man sie dort benutzen will. Globale Variablen darf man nicht verwenden, weil sie den Programmfluß unübersichtlich machen. Weil Module nur Funktions- und Klassendefinitionen enthalten, macht der Satz "eine Variable an ein Modul übergeben" keinen Sinn.

target in Thread muß eine Funktion sein, Du rufst read() aber auf, daemon=True wird gleich beim Erzeugen des Thread-Objekts angegeben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du benutzt doch Qt. Das kennt queued connections zwischen Signalen und slots, und die sind dann thread sicher. Dazu muss auf beiden Seiten natürlich ein QThread arbeiten, und der Arbeitsthread darf nicht dauerhaft schleifen.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zu dem nicht dauerhaft schleifen der Hinweis auf `isInterruptionRequested()` auf `Qthread`-Objekten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah, das kannte ich noch nicht. Macht gewisse Sachen natuerlich einfacher.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ist ja auch relativ neu in Qt 5.2 hinzugekommen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und dann war da ja noch der Hinweis beim letzten mal, auf Threads zu verzichten, und das ganze in Timern zu machen. Was immer noch die bessere Loesung waere, denn Threads sind eben schwer.
Antworten