S0 mit PYthon auslesen eleganterer Weg?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ähm, das Problem ist nicht das Schlüsselwort ``global`` sondern globale Variablen. Und das ist `COUNTER` in diesem Fall. Nur weil man es wie eine Konstante benennt, ist eine veränderbare Liste die dann auch tatsächlich verändert wird, keine Konstante sondern eben auch wieder eine globale Variable.

    Und hier wird IMHO auch ein bisschen grosszügig davon ausgegangen, dass `append()` und `clear()` von Listen sich in einem nebenläufigen Programm nicht in die Quere kommen können. Das mag in der aktuellen CPython-Implementierung kein Problem sein, aber eigentlich müsste man das mit einem Lock absichern.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • miwi1706

    Ich würde das in etwa so machen:

    Ungetestet.

    4 Mal editiert, zuletzt von keepfear (6. Februar 2023 um 12:56)

  • Man könnte die Liste auch in der main() Funktion erstellen und diese den anderen Funktionen als Argument mitgeben.

    Nur um das noch nachzureichen.

  • keepfear Während man sich bei der Liste vielleicht noch auf das „global interpreter lock“ (GIL) von CPython “verlassen“ kann, ist `Counter` definitiv fehlerhaft, denn das ``+=`` ist hier keine atomare Operation. Hier kann das zurücksetzen auf 0 ”verloren” gehen wenn zeitgleich ein Inkrementieren erfolgt. Das *muss* man mit einem Lock absichern:

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • SO, hab jetzt ein wenig gespielt mit dem Programm und bin jetzt so weit gekommen, dass die Impulse gezählt werden (bounce_time ist mir immer noch unklar) und das die Werte zu vollen 10min in die DB geschrieben werden.

    Funktioniert so weit. Nach einen Neustart des PIs werden nur noch die Restsekunden zu 10min als sleep genommen.

    @__blackjack__

    Wo muss ich deinen obigen Code einfügen? So konform in Python bin ich leider nicht :daumendreh2:

  • Wo muss ich deinen obigen Code einfügen? So konform in Python bin ich leider nicht

  • miwi1706 Nimm das Beispiel von keepfear ! Wenn es Dir wirklich nur um einen Counter geht und nicht um einzelne Werte, dann braucht es keine Liste.

    Nur am Rande.... Das mit dem sleep (nextUpdate) ist viel zu umständlich, da hätte ein sleep(600) völlig ausgereicht um die Schleife für 10 Minuten zu stoppen.

    bounce_time ist mir immer noch unklar

    Ok, letzter Versuch.

    Stell Dir vor Du:

    - stehst und hältst einen Tennisball in dern ausgestreckten Hand

    - drückst auf einen Taster

    Du willst wissen wie oft

    - Du den Ball fallen gelassen hast

    - der Taster gedrückt wurde

    Du willst nicht wissen

    - wie oft der Ball nach dem Aufkommen auf dem Boden nochmals hochgesprungen ist, bist dieser endgültig liegen bleibt

    - ob beim Tasterdruck Staub zwischen den Kontakten war und damit der Taster prellt

    Um bei dem Ball zu bleiben: Mit einer Softwareentprellung / BounceTime wird das erste Aufschlagen des Balls erkannt und das nachfolgende wieder Hochspringen und erneuten Ballkontakte mit dem Boden solange ignoriert, wie die BounceTime eingestellt ist. Bei einem Tennisball wären das bestimmt mindestens 5 Sekunden, bis man halbwegs sicher sein kann, dass der Ball ruhig am Boden ist.

    Ohne dieser Entprellung würde jeder Kontakt zum Boden gezählt, aber Du willst ja wissen wie oft der Ball fallen gelassen wurde. ;)

    (//Edit Der Nachteil daran ist, dass wenn die Zeit zu hoch gewählt wurde, man das nächste Event verpassen könnte.)

    Hoffentlich war das etwas verständlicher ausgedrück! ^^

  • hyle

    Das habe ich auch so in der Dokumentation gelesen. Ich hatte vorher einen sleep von 0.05, was ja 50ms entsprechen sollte bei 30ms Impulslänge. Es wurden (so denke ich und passte auch vom Verbrauch her) fast alle Impulse gezählt. Bei der bounce_time hatte ich auch 0.05 eingestellt. Aber ich bekam nur einen einzigen Impuls gezählt oder gar keinen. Das verstehe ich nicht, da ja lt. Doku der Eingang gesperrt wird in der Zeit, welche als bounce_time eingegeben wurde. Aber ich werde damit noch mal rumspielen. Man sagt ja immer, der größte Fehler sitzt davor :conf:

    :danke_ATDE:

    keepfear

    Danke für die Antwort, werde ich spätestens am Wochenende mal umsetzen

Jetzt mitmachen!

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