Timer



  • Warum funktioniert meine Timer Funktion nur erst ab einem Interval von >= 1 Sekunde? Ich wollte eigentlich mit Millisekunden arbeiten, aber trotzdem macht er mir immer mind. 1 sekudne draus.

    #include <ctime>
    #include <iostream>
    using namespace std;
    
    bool timer(time_t var);
    
    int main()
    {
        while(1)
        {
            if(timer(100)) cout << "RING!" << endl;
        }
    
        return 0;
    }
    
    bool timer(time_t var)
    {
        static time_t ende = 0;
        static time_t start = 0;
    
        start = time(0)*1000;
        if(ende == 0)
        {
            ende = start + var;
        }
    
        if(start >= ende)
        {
            ende = 0;
            return true;
        }
        else return false;
    }
    

    MfG
    Stromberg



  • tja, woran wird das wohl liegen...?



  • +rolf+ schrieb:

    tja, woran wird das wohl liegen...?

    Woran bitte?

    MfG
    Stromberg



  • Der "Fehler" liegt darin, dass du in if (timer ()) 100 geschrieben hast! Also zählt er in 1 Sekundenschritten.

    if (timer (75))
    

    so müsste es aussehen, wenn du 75ms Schritte angezeigt bekommen wolltest.

    Im Endeffekt muss du deinen Timer immer verändern wenn du andere Werte rausbekommen oder gestoppt haben möchtest

    Hab aber nit geguckt ob es stimmt. 😮



  • Sry, ich kann grad nicht ganz folgen.
    Auch bei time(75) macht die Funktion leider keine 75ms schritte sondern auch nur 1 Sekunden Schritte.
    Also, sowas geht: timer(1000) -> Sekunde timer(2000) -> Sekunden timer(3000) -> 3 Sekunden..... aber timer(100) timer(75) etc. funktioniert nicht, bzw. wird einfach zu 1 Sekunde. Und ich weiß nicht wie ich dieses Problem lösen kann?

    MfG
    Stromberg



  • Sorry Walnut_Burl,

    aber es ist völlig egal, welcher Wert übergeben wird, es wird immer nur im Sekundentakt gezählt, da time() nur die Zeit in Sekunden zurückgibt.

    Die Genauigkeit kann man damit nicht erhöhen...



  • So...

    jetzt konnt ich mirs mal angucken!

    Du kannst die Geschwindigkeit der Zählung erhöhen bzw verlangsamen, wenn du

    start = time(0)*1000
    

    änderst.
    Bei

    start = time (0)*10000
    

    beispielsweise zählt der Timer schneller.
    Bei

    start = time (0)*100
    

    wäre er dann langsamer.

    Ich hoffe dass dies deine Frage beantwortet 👍



  • Mh ja gut ist mir klar, deshalb habe ich ja auch time(0) * 1000 geschrieben, weil ich mit meiner Funktion Millisekunden messen wollte und keine Sekunden. Und meiner Meinung nach ergeben die von time ausgegebenen Sekunden X * 1000 = Millisekunden, trotzdem funktioniert es nicht.
    Kann es vll. daran liegen dass time_t zu klein ist für Millisekunden (also die Zahl zu groß wird)...ich habe keine ahung.

    MfG
    Stromberg



  • Das Problem ist, dass time(0) nur sekundengenau zurückliefert, da hilf auch mutliplizieren nicht...

    du bekommst dann eben statt den Werten 1s, 2s, 3s 1000ms, 2000ms, 3000ms, aber die genauigkeit ist nicht größer, weil die werte dazwischen nicht erreichbar sind.

    Schau mal nach der Funktion clock() aus <ctime>, die liefert ein genaueres Ergebniss. mit CLOCKS_PER_SEC kannst du dass dann auch in Sekunden umrechnen.



  • Okay, danke dass könnte vll. eine gute Alternative sein.
    Ich hab mir dass gleich mal in der C++ Referenz angeschaut, was ist den mit: "Returns the number of clock ticks elapsed since the program was launched." gemeint? "Number of clock ticks"? Sind damit die Millisekunden gemeint, oder wie kann ich mir dass vorstellen? Ich hab mir "clock()" mal in ner while-Schleife n paar mal ausgeben lassen, und mein gefühl sagt mir dass es Millisekunden sind, also würde von der Zeit her genau passen. (also Millisekunden seit Anfang des Programmstarts)

    MfG
    Stromberg

    EDIT:
    Also mein Programm funktioniert jetzt zumindestens grandios:

    #include <ctime>
    #include <iostream>
    using namespace std;
    
    bool timer(clock_t var);
    
    int main()
    {
        while(1)
        {
            while(1)
            {
                if(timer(100)) cout << "100 Millisekunden" << endl;
            }
        }
    
        return 0;
    }
    
    bool timer(clock_t var)
    {
        static clock_t ende = 0;
        static clock_t start = 0;
    
        start = clock();
    
        if(ende == 0)
        {
            ende = start + var;
        }
    
        if(start >= ende)
        {
            ende = 0;
            return true;
        }
        else return false;
    }
    


  • Mit 100% Prozessorauslastung (bzw. Kernauslastung) - toll!



  • Wie meinst du das? Höre ich da etwas Ironie heraus? (die ich leider aus Kenntnismangel nicht verstehe)

    MfG
    Stromberg



  • Sind damit die Millisekunden gemeint, oder wie kann ich mir dass vorstellen?

    Was clock ticks sind ist erstmal nicht genau festgelegt, um herauszubekommen, was das tatsächlich für ne Zeit ist, kannst du CLOCKS_PER_SEC nutzen.

    Mit 100% Prozessorauslastung (bzw. Kernauslastung) - toll!

    Dein Programm mach den großteil der Zeit nichts weiter als warten, gibt jedoch keine Rechenleistung ab. Es ist halt immer damit beschäftigt, deine Bedingungen zu prüfen, und dass viel häufiger, als sinnvoll (mehr als einmal pro millisekunde bringt nichts).
    Um das zu beheben, kannst du in deine Schleife eine Sleep Funktion einbauen, die eine Millisekunde lang wartet und die CPU solange anderen Programmen zur Verfügung stellt.



  • Und wie nutze ich CLOCKS_PER_SEC? Einfach clock() * CLOCKS_PER_SEC? Und dann habe ich Sekunden? Aber wie komme ich dann von den Sekunden wieder auf Millisekunden? mit mal 1000?

    MfG
    Stromberg


  • Administrator

    Frage:
    Wieso machst du nicht einfach ein boost::this_thread::sleep(boost::posix_time::millisec(100)) ? Ist zwar immer noch eine sehr schlechte Lösung, aber deutlich besser als deine Schlaufe.

    Grüssli



  • Die while Schleife ist doch völlig egal, ist doch nur zum testen. Was habt ihr denn alle damit? Ist doch kein riesiges Programm oder sowas jetzt. Sondern nur 40 Zeilen Code. Mit boost kenne ich mich nicht aus, und es geht mir hier halt nur ums rumtüfteln.

    MfG
    Stromberg


  • Administrator

    Stromberg schrieb:

    Die while Schleife ist doch völlig egal, ist doch nur zum testen. Was habt ihr denn alle damit? Ist doch kein riesiges Programm oder sowas jetzt. Sondern nur 40 Zeilen Code. Mit boost kenne ich mich nicht aus, und es geht mir hier halt nur ums rumtüfteln.

    Dir wurde schon gesagt, was wir dagegen haben. Du benutzt 100% der CPU für nichts und nimmst diese Rechenzeit auch noch den anderen Prozessen weg für nichts. Ist das nicht begreiflich, dass jeder sagt, dass dies ganz schlechter Programmierstil ist und man dies nicht tun soll? Für Timer gibt es allerhand bessere Lösungen.

    Grüssli



  • 1. Es heißt clock() / (double)CLOCKS_PER_SEC, dann bekommst du die Sekunden als Double-Wert.
    2. Wenn (wie mehrere Lesute auch schon vor mir sagten) du dauernd auf die Uhr schaust, weil du in einer haben Stunde aus dem Haus musst, dann kannst du in dieser halben Stunde nichts mehr machen. Wenn du dagegen dir einen Wecker stellst, dann kannst du die restliche Zeit nutzen.
    Und genau das ist der Unterschied von Sleep() zu clock():
    Sleep(100) (aus <windows.h>) sagt Windows, dass es 100 Millisekunden lang andere Prozesse bevorzugen und dann zu deinem zurückkehren soll.
    Falls du Linux benutzt, kannst du usleep(int Mikrosekunden!!) aus <unistd.h> benutzen.


Anmelden zum Antworten