Thread per Buttonclick beenden
-
- 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?
-
- 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
-
- 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:
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?
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)
-
- User
- Beiträge: 42
- Registriert: Freitag 27. Juni 2008, 12:21
das heißt:
mit
ersetzen? bringt das was oder hängt er dann in der schleife?
Code: Alles auswählen
sleep(video.dauer)
Code: Alles auswählen
for i in range(video.dauer):
sleep(1)
-
- 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!?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.dirty sanchez hat geschrieben:ersetzen? bringt das was oder hängt er dann in der schleife?Code: Alles auswählen
for i in range(video.dauer): sleep(1)
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
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
-
- 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!?
-
- 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)
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)
-
- User
- Beiträge: 42
- Registriert: Freitag 27. Juni 2008, 12:21
alles klar. danke für die hilfe. werds mit event machen.