Seite 1 von 1

Re: Qt - Threads - Timers cannot be stopped from another thread

Verfasst: Freitag 22. September 2023, 18:32
von __deets__
Man kann keine GUI im anderen Thread betreiben. Geht einfach nicht. Die Funktion two hingegen, die kann im Hintergrund laufen. Sobald sie aber GUI-Elemente beeinflussen soll, muss das über die passenden Mitte wie zB QueuedConnections gehen.

Re: Qt - Threads - Timers cannot be stopped from another thread

Verfasst: Freitag 22. September 2023, 19:36
von __deets__
Warum drehst du die Threads nicht einfach um, wie vorgeschlagen?

Re: Qt - Threads - Timers cannot be stopped from another thread

Verfasst: Samstag 23. September 2023, 12:48
von __deets__
sys.exit beendet das Programm sofort. Wenn du das nicht willst, musst du stattdessen den Hintegrundthread geordnet runterfahren.

Re: Qt - Threads - Timers cannot be stopped from another thread

Verfasst: Samstag 23. September 2023, 13:02
von __deets__
Um mal zu illustrieren, wie sowas gehen kann:

Code: Alles auswählen

import queue
import threading
import time

def background_task(task_queue):
    while True:
        action = task_queue.get()
        if action == "stop":
            print("stopping")
            break
        else:
            print("working hard on", action)



def main():
    tasks = queue.Queue()
    t = threading.Thread(target=background_task, daemon=True, args=(tasks,))
    t.start()
    tasks.put("important stuff")
    time.sleep(3)
    tasks.put("stop")
    t.join()


# main guard
if __name__ == '__main__':
    main()
Natuerlich muss bei dir die task-queue aus der GUI beschrieben werden, und die get-Methode kennt auch einen timeout oder eine empty-Exception, wenn der Task die ganze Zeit laeuft, und man nur mal schauen will. Aber man muss eben periodisch pruefen, ob man sich beenden soll.

Re: Qt - Threads - Timers cannot be stopped from another thread

Verfasst: Samstag 23. September 2023, 17:46
von __blackjack__
@bachatero18: Falls wir hier immer noch von Qt reden, könnte man das `finished()`-Signal von `QThread` einfach mit der `close()`-Methode vom Fenster verbinden.