Thread per Buttonclick beenden

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.
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

Code: Alles auswählen

import threading

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
       
        self.stopped = threading.Event()
   
    def run(self):
        while not self.stopped.isSet():
            #Hier irgend etwas machen
            ....
   
    def stop(self):
        #Anhalten ausloesen
        self.stopped.set() 
das hat EyDu bei nem älteren Beitrag "Thread zerstören" geschrieben. ich versteh nicht ganz warum bei dem event ein self davor muss. dann würd mich noch interessieren wie man die funktion stop von einer anderen klasse aus aufrufen kann!? vllt kann jemand helfe?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

dirty sanchez hat geschrieben:das hat EyDu bei nem älteren Beitrag "Thread zerstören" geschrieben. ich versteh nicht ganz warum bei dem event ein self davor muss. dann würd mich noch interessieren wie man die funktion stop von einer anderen klasse aus aufrufen kann!? vllt kann jemand helfe?
Ein Tutorial kann helfen, denn das ist, ganz ehrlich, OOP-Grundwissen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

naja ein tutorial kann meine frage nicht beantworten. ich weiß auch dass ich die funktion stop in einer anderen klasse so aufrufen kann:

Code: Alles auswählen

t = MyThread()
t.stop()
aber es funktioniert irgendwie nicht. das event wird auch von false auf true gesetzt, jedoch mein thread wird nicht beendet!?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

dirty sanchez hat geschrieben:naja ein tutorial kann meine frage nicht beantworten. ich weiß auch dass ich die funktion stop in einer anderen klasse so aufrufen kann:[...]
Du hast völlig recht. Man ein Tutorial auch nicht ordentlich durcharbeitet, dann beantwortest es gar keine Fragen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn es das stopped-Flag setzt, musst du natürlich warten, bis run() wieder die Abbruchbedingung prüft. Das scheint bei dir nicht der Fall zu sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

ja genau, klingt logisch. wie krieg ich hin dass run() die Abbruchbedingung dauernd prüft? liegt wohl daran dass es nicht prüfen kann während der thread schläft?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn dein Thread blockiert, etwa durch ``sleep()`` oder auf IO wartend, dann kann es natürlich nicht geprüft werden. Also musst du schauen, dass der Thread-Code nicht blockiert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

ok ich erklär kurz was mein problem ist:
ich hab eine playlist mit paar videos. die sollen einzeln nacheinander abgespielt werden. hier beispielcode:

Code: Alles auswählen

for videos in playliste:
    self.abspielen(video)
    sleep(video.dauer)
und diese schleife steht in der while-schleife die das flag abfragt um den thread zu beenden. nun ist die frage wie ich richtig auf das flag prüfen kann damit der thread jederzeit beendet werden kann?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Indem du die Sleep-Dauer runterdrehst, d.h. den Thread immer nur für zum Beispiel eine Sekunde schlafen lässt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

das heißt:

Code: Alles auswählen

sleep(video.dauer)
mit

Code: Alles auswählen

for i in range(video.dauer):
    sleep(1)
ersetzen? bringt das was oder hängt er dann in der schleife?
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

ne bringt auch nix. krieg die while-schleife nicht von aussen beendet. ich krieg nur hin, dass der thread nachdem alle videos abgespielt sind beendet wird. aber während die videos laufen bzw der thread schläft kriegt er das event nicht mit!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

dirty sanchez hat geschrieben:

Code: Alles auswählen

for i in range(video.dauer):
    sleep(1)
ersetzen? bringt das was oder hängt er dann in der schleife?
Das bringt doch nichts. Dann hängt er doch immer noch in der While-Schleife. Nur statt einmal video.dauer Mal eben video.dauer mal eine Sekunde.

Code: Alles auswählen

current_dauer = 0
for videos in playliste:
    if current_dauer = 0:
        self.abspielen(video)
    if current_dauer == video.dauer:
       current_dauer = 0
    else:
        sleep(1)
        current_dauer += 1
(ungetestet, aber auf jeden Fall muss jedes mal die while-Schleifenbedingung ausgewertet werden, dein Code darf die Schleife nicht blokieren)

Edit: Das ist natürlich auch Blödsinn. Da müsste man die while-Schleife in die for-Schleife verschieben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

also irgendwie komme ich nicht weiter. danke leonidas für deine hilfe aber dein programm funktioniert nicht so wie es sollte. das sleep hat zur folge dass immer nur für die anzahl der sequenzen geschlafen wird und nicht für ihre dauer. das verschieben der while in dir for schleife versteh ich nicht wirklich weil ich ja dann immernoch das problem habe, dass ich nicht aus der while schleife rauskomme!?
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

Code: Alles auswählen

def abspielen(self):
    global stopflag
    stopflag = False
    start_new_thread(self.test,())

def beenden(self):
    stopflag = True

def test(self):
    for element in wiedergabeliste:
        if stopflag:
            print stopflag
            break
        else:
            self.videoabspielen(element)
            for i in range(element.dauer):
                if stopflag:
                    print stopflag
                    break
                else:
                    print i
                    sleep(1)
habs jetzt mal so probiert, klappt aber auch nicht. wie kann man den verdammten thread abbrechen?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das kann so ja nicht funktionieren, weil ``stopflag`` in ``beenden`` einfach eine lokale Variable ist. Außerdem würde ich für so etwas eher ``threading.Event()`` nehmen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

self.stopflag... btw. vergiss besser dass es global gibt.
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

alles klar. danke für die hilfe. werds mit event machen.
Antworten