Seite 1 von 2

Verfasst: Freitag 1. August 2008, 11:01
von dirty sanchez

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?

Verfasst: Freitag 1. August 2008, 11:51
von Leonidas
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.

Verfasst: Freitag 1. August 2008, 12:14
von dirty sanchez
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!?

Verfasst: Freitag 1. August 2008, 12:16
von audax
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.

Verfasst: Freitag 1. August 2008, 12:18
von Leonidas
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.

Verfasst: Freitag 1. August 2008, 12:54
von dirty sanchez
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?

Verfasst: Freitag 1. August 2008, 13:11
von Leonidas
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.

Verfasst: Freitag 1. August 2008, 13:24
von dirty sanchez
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?

Verfasst: Freitag 1. August 2008, 13:31
von Leonidas
Indem du die Sleep-Dauer runterdrehst, d.h. den Thread immer nur für zum Beispiel eine Sekunde schlafen lässt.

Verfasst: Freitag 1. August 2008, 13:39
von dirty sanchez
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?

Verfasst: Freitag 1. August 2008, 13:47
von dirty sanchez
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!?

Verfasst: Freitag 1. August 2008, 14:36
von Leonidas
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.

Verfasst: Dienstag 5. August 2008, 08:49
von dirty sanchez
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!?

Verfasst: Donnerstag 7. August 2008, 13:04
von dirty sanchez

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?

Verfasst: Donnerstag 7. August 2008, 13:09
von Trundle
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.

Verfasst: Donnerstag 7. August 2008, 13:09
von DasIch
self.stopflag... btw. vergiss besser dass es global gibt.

Verfasst: Donnerstag 7. August 2008, 13:42
von dirty sanchez
alles klar. danke für die hilfe. werds mit event machen.