Stoppuhr



  • Moin

    Ich versuche eine Stoppuhr zu schreiben,nur leider weiß ich nicht wie ich das angehen soll.Ich hab mir gedacht dass man das vieleicht mit einer for-schleife machen könnte aber das klappt irgendwie nicht richtigt 😕 😕

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    int x;
    int p;
    int main()
    {
        cout<<"1 drücken um die Uhr zu starten: \n";
        cin>>x;
    
        if(x==1)
        {
    
        for(p=0;p<=60;p=p++)
        {
        cout<<""<<p<<"";
    }
    
    else if(x==2)
    usw........
    
    }
    }
    


  • hi,

    anderer vorschlag:

    nimm beim start und beim stop die systemzeit in ms. subtrahiere sie voneinander und du hast eine nahezu ms genaue stoppuhr.

    gruss
    msp



  • und wie kann ich die Systemzeit in ms. messen?
    greez



  • du hast folgendes in der schleife geschrieben:
    "(p=0;p<=60;p=p++)" sollte es nicht (p=0;p<=60;p++) heisen??



  • Was willst du überhaupt genau erreichen. Ist mir immoment nicht ganz klar.





  • Versuchs mal mit der:



  • hi,

    ms misst man zb mit der funktion GetSystemTime(...)

    gruss
    msp



  • fsdfds schrieb:

    Was willst du überhaupt genau erreichen. Ist mir immoment nicht ganz klar.

    Ich versuche mir eine Stoppuhr zu programmieren,die jede Sekunde eine Sekunde weiter zählt.Wenn 60´Sekunden erreicht sind soll sie auf eine minute weiterspringen und wenn 60 minuten erreicht sind soll sie auf eine stunde springen,aber die Sekunden und minuten sollen immernoch mitaufen.

    Ich brauche auch kein Bild von einer Uhr,weil ich das ganze ohne Gui machen will.
    Btw: Kennt jemand ein gutes GUI-tutorial für Cpp?

    EDIT:Ich habs jetzt hinbekommen,dass das Programm bis 60 zählt,nur geht das alles viel zu schnell.Gibt es die Möglichkeit,irgendwie mit sleep(1000); die Zeit einzustellen?

    Edit2:Ich habe es mit sleep hinbekommen,allerdings sieht man die Zahlen nur ganz kurz und kann sie nicht lesen 😞

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int x;
    int p;
    int main()
    {
    cout<<"1 drücken um die Uhr zu starten: \n";
    cin>>x;

    if(x==1)
    {

    for(p=0;p<=60;p=p+1)
    {
    system("cls");
    Sleep(1000);
    cout<<""<<p<<"";
    }

    ;
    }

    Thx



  • hi,

    so kannst du es machen, wird aber ungenau werden. sleep wartet annaehern 1000 ms. wenn du noch einen vergleich und eine erhoehung einer variablen machst wird es ungenau (ok, auf schnellen systemen nahezu unmerkbar). nutze die funktion GetSystemTime um eine gewisse zeit zu warten.

    gruss
    msp



  • Und wie soll das mit GetSystemTime funktionieren? 😮
    Greez



  • 😕 😕 PUSH 😕 😕



  • Ich hab Dein Problem immer noch nicht ganz verstanden... was willst Du eigentlich genau machen? Eine (kurze) Zeit messen? Dann verwende QueryPerformanceCounter; das ist das genaueste was Windows bieten kann.



  • Ich benutze zum berechnen einer Dauer GetTickCount()

    #include <windows.h>
    int main()
    {int start, stop;
    start=GetTickCount();
        printf ("Start: %d",start);
        printf("\n");
    //Hier werden die zu testenden Aufgaben durchgeführt
    
    stop=GetTickCount();
        printf ("Stop: %d\n",stop);
    
        printf ("Dauer der operation\? : %d\n",stop-start);
        system("PAUSE");
        return(0);
    }
    

    Remarks:
    The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if Windows is run continuously for 49.7 days.
    Windows NT: To obtain the time elapsed since the computer was started, look up the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8 byte value.



  • Wieso printf ??

    printf ist doch aus C und nicht aus Cpp oder??

    Mfg



  • 'printf' dient zur Ausgabe in einer DOS-Box! 😃



  • schnurres schrieb:

    Ich versuche mir eine Stoppuhr zu programmieren,die jede Sekunde eine Sekunde weiter zählt.Wenn 60´Sekunden erreicht sind soll sie auf eine minute weiterspringen und wenn 60 minuten erreicht sind soll sie auf eine stunde springen,aber die Sekunden und minuten sollen immernoch mitaufen

    Da brauchste sogar gar nicht die WinAPI für:

    #include <iostream>
    #include <iomanip>
    #include <ctime>
    
    int main() {
        using namespace std;
        {
            bool start;
            cout << "0 - Beenden\n1 - Stoppuhr starten" << endl;
            cin >> start;
            if(!start) {
                return 0;
            }
        }
        cout << endl;
        clock_t start = clock();
        while(true) {
            int seconds = (clock() - start) / CLOCKS_PER_SEC;
            cout << "\r" << setw(2) << seconds / 60 << "min " << setw(2) << seconds % 60 << "s" << flush;
        }
        return 0;
    }
    

    Das mit den Stunden hab ich noch nicht eingebaut, aber das sollte kein Problem sein.

    mfg.



  • Aus Zeiten von Endlosschleifen die 100% CPU benötigen, sollten wir eigentlich entwachsen sein...



  • Jochen Kalmbach schrieb:

    Aus Zeiten von Endlosschleifen die 100% CPU benötigen, sollten wir eigentlich entwachsen sein...

    gut, dann schreib mal die lösung die das mit der standardbibliothek erledigt.

    da kann man dann halt einfach ein Sleep(1); in die Schleife packen, aber das wäre dann wieder winapi.

    mfg.



  • OT: Soll ich nach "C++" verschieben !? Das Forum heisst WinAPI, oder?



  • Jochen Kalmbach schrieb:

    OT: Soll ich nach "C++" verschieben !? Das Forum heisst WinAPI, oder?

    Stimmt, hast Recht, war blöd von mir.

    So sieht das ganze dann ohne 100% aus (und mit den Stunden):

    #include <iostream>
    #include <iomanip>
    #include <ctime>
    #include <windows.h>
    
    int main() {
        using namespace std;
        {
            bool start;
            cout << "0 - Beenden\n1 - Stoppuhr starten" << endl;
            cin >> start;
            if(!start) {
                return 0;
            }
        }
        cout << endl;
        clock_t start = clock();
        while(true) {
            int seconds = (clock() - start) / CLOCKS_PER_SEC;
            int minutes = seconds / 60;
            cout << "\r" << setw(2) << minutes / 60 << "h "
                 << setw(2) << minutes % 60 << "min "
                 << setw(2) << seconds % 60 << "s" << flush;
            Sleep(1);
        }
        return 0;
    }
    

    Eleganter wär's natürlich mit einem Timer, aber so verbraucht's auch so gut wie nichts.

    mfg.


Anmelden zum Antworten