Timer in Python

  • Hallo zusammen,

    Ich bin auf der suche nach einer Lösung für einen Timer der das Programm jedoch nicht "aufhält" sondern weiterlaufen lässt.

    Bei einem Arduino löse ich das wie folgt:

    Code
    unsigned long currentMillis = millis();
     
      if(currentMillis - previousMillis > interval) {
        previousMillis = currentMillis;

    etc.

    Kann mir jemand helfen sowas zu erstellen?

    Gruss Schnibli

    Ready when you are :bravo2:

  • Vermute da wirst du um Multithreading nicht drum herum kommen.

    In deinem Beitrag angegebene Code handelt es sich wohl noch nicht um einen äuquvaltente Timer.

    Wenn du einem Timer entwickeln willst, wird oft eine while schleife gemacht und mit einer Bedingung geprüft ob die vorgesehene Zeit erreicht wurde. Wenn du ledelig nur einmal fragst ob die Zeit erreicht wurde handelt es sich hierbei nicht um einen Timer also wird das in der Regel wohl in eine Schleife gepackt sein, die loop funktion, richtig?

    Denn die wird ja immer wieder von neu gestartet.

    Ohne Multithreading, würde ich da auch in einer Schleife das packen.

    sowas wie :

    Code
    anfang = time();while(true)
    {
        aktuell = time();
        if((aktuell - anfang) > X)
        {
            doSomeThingSpecial();
        }
        doLotOfCommands();
    }

    Dann läuft das Programm weiter, jedoch nicht Paralell, das heißt, wenn jetzt die FUnktion doLotOfCommands() eine menge sachen zutun hat, wirst du nicht mitkriegen, dass die vorgesehene Timer die zeit erreicht hat, also könntest du verpennen oder die Eier nicht rechtzeitig vom Herd nehmen.

    Unterm Strich,

    würde vorsichtig sein mit wie man das auf den Mikroprozessor macht und dann wie man es auf einem "PC" macht, ja der Begriff ist unglücklich gewählt, hoffe nur es wird verstanden was ich damit meine.


    So auf der Schnelle, ist das nicht Interessant: ?

    https://stackoverflow.com/questions/1243…every-n-seconds

  • Hallo schnibli,

    Deine Timer wären genauer wenn Du in Zeile 4 schreiben würdest:

    previousMillis = previousMillis + interval;

    andernfalls ist Dein Timer etwas zu langsam für den Fall, dass die Routine mal nicht exakt in einer Millisekunde aufgerufen wird.

    Gruß

    Prittzl

  • Hallo,

    schnibli: das ist kein Timer (im eigentlichen Sinn), sondern es wird doch "nur" geprüft, ob eine bestimmtes Zeitintervall verstrichen ist. Das kannst du in Python genau so machen. Stichwort: datetime-Modul, timedelta-Objekte.


    Da der Raspi aber ein Computer ist, auf dem nach X andere Prozesse laufe, kann du nicht _nicht_ aus ms-genaues Timing verlassen. Der Python-Code wird immer dann (weiter) abgearbeitet, wenn der Linux Prozess-Scheduler dem Python-Interpreter Rechenzeit zu teilt.

    Gruß, noisefloor

  • Hallo schnibli,

    so wie Du das in Deinem ersten Beitrag beschrieben hast, ist das doch machbar.

    In dem SoC BCM2835 des Raspberries gibt es eine long long Speicherstelle, deren Inhalt jede µ-Sekunde um 1 erhöht wird. Die kann man für

    Zeit- und Timer-Funktionen nutzen.

    Wenn Du das ganze in C programmieren möchtest, kann ich Dir ein Beispiel-Projekt geben.

    Intervalle von 1 ms sind damit kein Problem.

    So etwas geht natürlich nicht mit Python oder WiringPi, weil die einen viel zu großen Overhead haben.


    Bei Interesse kann ich Dir ein Musterprojekt aus "Visual Studio 2015" für den Raspberry zur Verfügung stellen.

    Gruß Prittzl

  • Wenn Du das ganze in C programmieren möchtest, kann ich Dir ein Beispiel-Projekt geben.

    Seine Frage wurde im Forum-Bereich Python gestellt...

    In dem SoC BCM2835 des Raspberries gibt es eine long long Speicherstelle, deren Inhalt jede µ-Sekunde um 1 erhöht wird. Die kann man für

    Zeit- und Timer-Funktionen nutzen.

    Wieso erst auf erneuter Nachfrage zeigen wie das geht?

    So etwas geht natürlich nicht mit Python

    Ähm, doch.

  • Seine Frage wurde im Forum-Bereich Python gestellt...

    Überrascht dich das? Diese Antwort (pseudo-Icon Code, kürzer geht nicht) wurde auch im Subforum Python beigetragen. :conf:

    Der Kampf gegen das Chaos scheint verloren :X

    So, ich gehe dann mal einen pseudo-Python Code compiler schreiben, der einen Funktionsaufruf magic() (=gesamtes Programm) in das gewünschte Programm umwandelt. Das poste ich dann in "Andere Programiersprachen".

    Sorry, aber manchmal...

  • hier wird ein scheiss zusammen getragen das ist schon peinlich.

    Gefragt wurde nach einen timer. Ein beispiel von einen arduino lösung wurde beigelegt wie der "timer" funktioiert.

    Ich will den fragesteller nichts unterstellen aber so wie es scheint hat er nicht viel erfahrung mit den programmieren. Soll nicht böse rüberkommem aber mir scheint so das da nicjt ganz durchgedrongen ist wieso das so bei der arduino so funktioniert. Deshalb auch seine fragenstellung.

    Es lässt sich drauf schliessen dass es einen timer auf der PI sein soll.

    Zudem wird geschrieben dass es nicht die software anhalten soll also wird schonwas vom erfasser versucht worden sein. Schade das hier nicht die quellcode passage bei gepackt wurde.

    So und nun geht es hier los mit "das geht nur unter icon nicht unter python" dann wird diskutiert wie die if abfrage sein soll die so niemals unter ein "nicht arduino" funktionieren kann.

    Dann schreib doch mal einen timer in c oder icon oder sonst was ihr werdet feststellen "man braucht eine schleife"...

    Klar hier entsteht wieder eine flame war, ja ich weiss auch hier gibt es bestimmte funktionen ich nutze unter c# den dispatcherTimer. Der übrings auch nichts anderes macht als im einem extra thread ständig zu prüfen ob die zeit rum ist. dort ist der trick bei der ganze geschichte. Dann braucht man damit das programm trotzdem weiter ausgeführt wir einen extra thread! Damit die schleife im hintergrund weiter ausgeführt wird.

    Und das geht unter alle programmiersprachen die es einem erlaubt threads zu erzeugen und dort gehört auch python dazu.

    Sorry aber was soll der ganze mist, dass man das in c prpgrammieren muss weil es sonst nicht gehen würde. Zudem ist es einfach um einen thread zu erzeugen in c c++ und icon??

  • Keine Ahnung wieso das bei euch nicht ankommt: Er hat explizit nach PYTHON gefragt, der Thread hier ist auch explizit im PYTHON Bereich erstellt - also wieso labert ihr hier von C / C++ oder Icon usw?

    Hört bitte mit dieser verflucht dreisten Art und Weise auf! Es reicht langsam! Achtet auf die Frage der Frager und respektiert diese :!:


    Der TE zeigt wie sowas aufm Arduino gelöst wird und genau so möchte er das auch in Python haben.

    Wer ein Arduino-Sketch schon mal geschrieben hat weiß dass da eine Schleife sein muss und genau da kommen solche Zeilen wie in Beitrag#1 zu sehen auch rein. Das steht außer Frage.

    Das Funktionsprinzip vom Arduino ist im ersten Script aus Beitrag#5 nachgebildet und identisch. Wenn er dennoch einen "Timer" haben möchte kann er das 2.Script verwenden.

  • Kann nur anschliessen . Wie auch der link von stackoverflow. Hier wird jedoch einen extra thread für angelegt.

    Mir ist auch bewusst wieso das bei arduino funktioniert.

    Nur mir persönlich geht sowas auf den nerv das über gott und die welt dann dibattiert wird bei sowas und finde es allmählich lächerlich sowas xD

    Obwohl ich hier nich nicht lange bin.:angel:

  • Du debattierst hier doch nun auch...

    Aus einer Kleinigkeit wird nen riesen Wirbel gemacht... Das fängt schon damit an mit Codeschnipseln anderer Sprachen um sich zu werfen und geht über in Frage Stellung der verwendeten Begriffe.

    Der Themen-Ersteller hier schreibt:

    Er suche nach einer Lösung wo das Programm nicht aufgehalten würde, mit einem Arduino würde er das so und so lösen(!).

    Er kennt also bereits eine für ihn ausreichende Möglichkeit von einer anderen Programmiersprache, die er jetzt aber gerne auch mit Python nutzen möchte, nur nicht weiß Wie.

    Also ist die Sache doch eigentlich ganz einfach: Codebeispiel millis(); aus Beitrag#1 in Python umsetzen.

  • Schnibli hat seit fast einer Woche keine weiterführende Antwort auf seine Frage bekommen.

    Weil anscheinend keiner eine Python-Antwort weiß, habe ich Schnibli eben ein Projektchen angeboten, welches auch mit µ-Sekunden noch arbeitet.

    C scheint er ja zu können.

    Mit freundlichen Grüßen Prittzl


    Einmal editiert, zuletzt von Prittzl (11. Januar 2018 um 15:24)

  • Moin!

    1. - schnibli hat sich seit der Threaderstellung nicht mehr gemeldet.

    2.- Es sind in Beitrag #5 von @meigradfd 2 Wege aufgezeigt wie man es in Python lösen kann.

    Warum also nicht einfach warten bis sich der Threadersteller meldet??

    Nur mal so...

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Keine Ahnung wieso das bei euch nicht ankommt: Er hat explizit nach PYTHON gefragt, der Thread hier ist auch explizit im PYTHON Bereich erstellt - also wieso labert ihr hier von C / C++ oder Icon usw?

    Ich will es hier nicht weiter anfachen. Ich wollte mir nur einen Merker setzen auf welchen Post ich demnächst verweise wenn einer nach einer Möglichkeit fragt GPIOs via php zu schalten und Du mit deinem Python Server um die Ecke kommst *duckundwech* ;);)

  • Na, moment, nun vermischst du hier aber auch grad was.

    Es macht nicht viel Sinn über PHP und exec(); / shell_exec(); "gpio" auszuführen. In solchen Beiträgen erwähne ich zudem Lösungen für beides, da ich hier zu beiden Themen ausführliche Anleitungen erstellt habe.

    Wäre es Dir lieber wenn ich in solch einem Fall gar nichts mehr schreibe? Weder Lösung für PHP noch eine bessere Alternative nenne?


    Sorry aber jetzt wird es IMHO lächerlich - und ich klinke mich somit aus.

Jetzt mitmachen!

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