Eigene zyklische Abfrage in Python

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Moin,

    Ich benutze einen Thread und in diesem Tread habe ich eine Funktion die ich nicht bei jedem Durchlauf aufrufen möchte.
    Das löse ich indem ich mir einfach die aktuelle Zeit merke und sie in jedem Durchlauf mit der dann aktuellen Zeit vergleiche.
    Wenn eine vordefinierte Grenze erreichr wurde (Intervall) wird die Funktion aufgerufen.

    Das Programm stürzt bereits in der Zeile wo ich die beiden Werte vergleiche ab wenn wenn ich den Zeitmerker mit

    Code
    ZeitLetzterZyklus = datetime.now()

    setze. Wenn ich die Initialisierung auskomentiere funktioniert das Programm komischerweise allerdings logischerweise nur bis zum
    nächsten Zyklus.

    [code=php]
    # Globale variablen:
    # Merker für den letzten Funktionsaufruf
    ZeitLetzterZyklus = datetime.now()
    # Alle 15 Sekunden soll was gemacht werden
    ZyklusSek = 15

    def Zyklusueberwachung()
    tmpZeitJetzt = datetime.now()
    tmpDifferenzSek = (tmpZeitJetzt - ZeitLetzterZyklus).total_seconds()
    # Wenn Zykluszeit abgelaufen
    if tmpDifferenzSek >= ZyklusSek:

    *****irgendwasmachen*****
       
    # Die Merk-Zeit aktualisieren
    ZeitLetzterZyklus = datetime.now()
    else:
    print("Noch " + str(ZyklusSek - tmpDifferenzSek) + " Sekunden")[/php]

    Einmal editiert, zuletzt von iosam (12. August 2015 um 08:53)

  • Hallo rob.z du hast Recht war ein Fehler der beim Kopieren passiert ist.

    Hallo meigrafd, würde gerne wissen warum mein Code nicht funktioniert. Kann ich mit deiner Methode innerhalb eines Threads mehre Funktionen zu unterschiedlichen Zykluszeiten aufrufen? Kann mit deinem Link leider noch nichts anfangen.

    Edit: Thema erledigt hatte eine Variable nicht als global deklariert :blush:

    Einmal editiert, zuletzt von iosam (12. August 2015 um 12:38)

  • Kann ich mit deiner Methode innerhalb eines Threads mehre Funktionen zu unterschiedlichen Zykluszeiten aufrufen?

    Ja.
    Man legt fest welche Funktion nach wie viel Sekunden ausgeführt werden soll. Es wird also ein Timer deklariert, festgelegt nach wie viel Sekunden ( 1.0 ) welche Funktion ( TimedRequest ) ausgeführt werden soll und optional welche Argumente ( ["1.0", "pitemp"] ) dieser übergeben werden sollen.. Das sind halt 2 Argumente die ich selbst festgelegt habe: ein mal die zyklische Zeit ( 1.0 ) und ein mal was innerhalb der Funktion ausgeführt werden soll bzw ich drauf prüfe ( pitemp ).
    Nach Ablauf der Zeit wird diese halt ausgeführt und der Timer beendet. Will man den Timer stetig ( zyklisch ) erneut ausführen muss man dies eben in der ausgeführten Funktion erneut festlegen und den Timer neu initialisieren.
    Und das ganze wird halt via GPIO-Interrupt ausgeführt...

    Dank 'threading' läuft der Timer im Hintergrund und kann nicht vom Haupt-Thread (dem Script) aufgehalten werden. Man muss also auch nicht selber zyklisch die vergangene Zeit prüfen und darauf achten das etwas auch blos ausgeführt wird - und kann somit auch nicht verzögert werden (weil das Script bereits was zu tun hat aber dafür länger braucht als vorgesehen etc.)

    Man kann das auch vereinfacht so darstellen:

    [code=php]import time, threading

    def auszufuehrendeFunktion(wann, text):
    wann = float(wann)
    text = str(text)
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    print "{} --> {}".format(zeit, text)
    timed = threading.Timer( wann, auszufuehrendeFunktion, [wann, text] )
    timed.start()

    timed1 = threading.Timer( 1.0, auszufuehrendeFunktion, ["2.0", "hallo iosam"] )
    timed1.start()
    timed2 = threading.Timer( 2.0, auszufuehrendeFunktion, ["2.5", "wenn du fragen hast dann frag bitte gezielt was du nicht verstehst"] )
    timed2.start()

    try:
    #keep script running
    while True: time.sleep(1)
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    [/php]

  • Wie wäre es mit pygame?
    [code=php]
    import pygame

    pygame.init()
    TIMELAPSE = pygame.USEREVENT + 1
    pygame.time.set_timer(pygame.USEREVENT + 1, 15000)

    def MyFunc():
    blabla...


    while True:
    try:
    for event in pygame.event.get():
    if event.type == pygame.USEREVENT + 1:
    MyFunc()

    sleep(0.1)
    except KeyboardInterrupt:
    sys.exit()[/php]

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!