While-Schleife für eine bestimmte Zeit lang ausführen

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.
Antworten
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

Metal Leute!

Weiß jemand von Euch evtl., wie man eine while-Schleife für eine bestimmte Anzahl an Sekunden ausführen kann? Sodass die Befehle, die sich in der Schleife befinden, für diese Anzahl an Sekunden (z.B. 30 Sekunden) ausgeführt werden, und danach die Schleife endet? Dafür bräuchte man ja eine Stoppuhr oder einen Timer... aber ich weiss leider nicht, wie man so etwas programmieren kann (auch wenn's bestimmt total einfach ist...).

Wär nett wenn Ihr mir helfen könntet!

Mit freundlichem Gruß
DieLordschaft
Zuletzt geändert von ProgrammierLord am Mittwoch 20. April 2016, 19:41, insgesamt 1-mal geändert.
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

Das hatte ich schon gesehn, und hab das auch schon ausgemettelt... hat aber net funktioniert. Trotzdem danke! Habt Ihr vielleicht etzela noch weitere Vorschläge?
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
BlackJack

@ProgrammierLord: „Hat aber net funktioniert“ ist eine ganz schlechte Fehlerbeschreibung. Was soll man dazu denn jetzt sagen? Das funktioniert nämlich so.

Also was hast Du denn genau gemacht, und was ist daraufhin passiert? Wenn es eine Ausnahme gab, dann bitte den kompletten Traceback 1:1 zeigen.
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

Ich werde das etzela noch mal versuchen einzumeddeln und dann sag ich Dir den Fehler! Vielleicht habe ich das auch falsch gemacht. Ich hatte etzela einen sehr stressigen Tag auf der Arbeit... selbstständig zu sein ist halt manchmal schwierig. Morgen nehme ich mir aber frei! Aber danke schonmal für Deine Hilfe... Metaler halten halt zusammen!
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

Etzela hab ich echt Scheiße am Arsch: Jetzt macht der keine Fehlermeldung mehr. Aber funktionieren tut der Timer noch immer nicht. Die While-Schleife wird unendlich lang ausgeführt... die Zeit wird wohl komplett ignoriert. Hätten Sie eine Idee woran das liegen tun könnte?
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
BlackJack

@ProgrammierLord: Wahrscheinlich ist da ein Fehler im Programm…
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

@BlackJack: Der rest des Programm tut ja einwantfrei funktionieren. Aber diese Zeitbegrenzte Schleife leider nicht. Bin schon kurz davor meinem PC-Computer die Prügel rauszuschmeissen! :oops: :oops: :oops: :oops: :evil: :evil: :evil: :evil: :evil: :evil:
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Meddl, zeig doch mal den betroffenen Codeabschnitt und gegebenfalls die Fehlermeldung. Sonst können wir dir nicht helfen. Und hör auf mit den ständigen Drachenlord-Anspielungen, die sind nämlich genau die Scheiße, auf die wir keinen Bock haben.
PS: Die angebotene Summe ist beachtlich.
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

Das ist ja etzela das Problem... es gibt keine Fehlermeldung, das Programm läuft einfach in einer unendlichen Dauerschleife, als hätte ich "while True" eingegeben...

finde übrigens witzig dass du als wohnort Wohnort: Altschauerberg 8 in 91448 Emskirchen angegeben hast, wo die leute hier doch genau auf diese Anspielungen keine Lust haben :)
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

import time

def repeated_call(func, duration):
    stop = time.time() + duration
    while time.time() < stop:
        func()
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

@snafu: Und wie kann ich das jetzt in die While-Schleife einmeddeln?
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@ProgrammierLord: das ist die while-Schleife. Die Funktion func sollte dabei nur kurz laufen, denn sonst wird ja die while-Bedingung nicht geprüft und damit die Schleife nicht nach 30s abgebrochen.
ProgrammierLord
User
Beiträge: 13
Registriert: Mittwoch 20. April 2016, 19:24

@Sirius3: und wie muss ich dann duration eingeben? Einfach die Zahl oder anders?
METAL LEUTE... BIN IMMER DANKBAR FÜR EURE HILFE
MIT FREUNDLICHEM GRUß
DIE LORDSCHAFT
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ProgrammierLord hat geschrieben:@Sirius3: und wie muss ich dann duration eingeben? Einfach die Zahl oder anders?
Warum ergreifst du nicht einfach die Eigeninitiative und schaust dir die selber die Dokumentation von time.time an? Anhand dessen sollte eigentlich klar sein, was bei duration angegeben werden muss.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

ProgrammierLord hat geschrieben:und wie muss ich dann duration eingeben? Einfach die Zahl oder anders?
Die Anzahl in Sekunden. Bei dir also zum Beispiel 30.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

ProgrammierLord hat geschrieben:@snafu: Und wie kann ich das jetzt in die While-Schleife einmeddeln?
Entweder `repeated_call` direkt aufrufen und die gewünschte Funktion übergeben (wobei ich bei der Funktionsübergabe bereits deine nächsten Probleme erwarte) oder den Code aus `repeated_call` übernehmen und in der Zeile, wo ``func()`` steht, die echte Funktion einsetzen. Im Falle der Codeübernahme müsstest du die `duration` dann natürlich auch direkt ersetzen bzw vorab ein ``duration = 30`` oder so machen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier ist übrigens auch der Einsatz als Dekorator denkbar. Sinnfreies Beispiel:

Code: Alles auswählen

from __future__ import print_function
from functools import wraps
from time import sleep, time

def repeated_call(duration):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            stop = time() + duration
            while time() < stop:
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeated_call(duration=5)
def repeated_hello(name):
    print('Hello', name)
    sleep(0.5)

if __name__ == '__main__':
    repeated_hello('World')
...ist letztlich aber nicht mehr als eine Spielerei. Soviel Code für eine simple Schleife ist geradezu Javaesk. ;)
Antworten