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

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