Seite 1 von 1

Thread

Verfasst: Donnerstag 10. August 2023, 20:21
von stresch89
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

Re: Thread

Verfasst: Donnerstag 10. August 2023, 20:26
von __blackjack__
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.

Re: Thread

Verfasst: Donnerstag 10. August 2023, 21:04
von Sirius3
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.

Re: Thread

Verfasst: Freitag 11. August 2023, 08:20
von __deets__
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.

Re: Thread

Verfasst: Freitag 11. August 2023, 09:45
von __blackjack__
Zu dem nicht dauerhaft schleifen der Hinweis auf `isInterruptionRequested()` auf `Qthread`-Objekten.

Re: Thread

Verfasst: Freitag 11. August 2023, 09:57
von __deets__
Ah, das kannte ich noch nicht. Macht gewisse Sachen natuerlich einfacher.

Re: Thread

Verfasst: Freitag 11. August 2023, 10:36
von __blackjack__
Ist ja auch relativ neu in Qt 5.2 hinzugekommen.

Re: Thread

Verfasst: Freitag 11. August 2023, 11:52
von __deets__
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.