C++ Timer



  • Hallo,
    Ich hätte mal eine Frage zu einem Timer in C++.
    Hierbei handelt sich nur um eine Konsolenanwendung.

    Wie schafft man es einen Timer nach dem Zählen von z.B. 1...2...3 ein Ereignis auslößen zu lassen z.B. cout << ..... ?

    Danke



  • Klar, zählen kannste ganz leicht mit ner for-Schleife. Soll dabei auch gewartet (ich denk mal genau eine Sekunde zwischen einer Zahl?) werden, musst du dir ne externe Lib besorgen (Boost wär ne Option) oder du greifst auf Betriebssystemspezifische Sachen zurück, unter Windows wäre das wohl Sleep .
    Anwendung davon:

    #include <windows.h>
    
    Sleep(/*Wert in Millisekunden, 1sek = 1000*/);
    

    Damit kannste dir was basteln.



  • Incocnito schrieb:

    Soll dabei auch gewartet (ich denk mal genau eine Sekunde zwischen einer Zahl?) werden, musst du dir ne externe Lib besorgen (Boost wär ne Option) oder du greifst auf Betriebssystemspezifische Sachen zurück, unter Windows wäre das wohl

    Nö.

    #include <iostream>
    #include <chrono>
    #include <thread>
    
    int main()
    {
        for(int i=1;i<=3;++i)
        {
                std::this_thread::sleep_for(std::chrono::seconds(1));
                std::cout<<i<<std::endl;
        }
    }
    


  • Das mit Sleep() funktioniert zwar,
    aber wie kann ich die einzelnen Sekunden jede Sekunde ausgeben?



  • D.J. schrieb:

    Das mit Sleep() funktioniert zwar,
    aber wie kann ich die einzelnen Sekunden jede Sekunde ausgeben?

    Schleife? Wie in Nymers Beispiel.

    Nymer schrieb:

    #include <iostream> 
    #include <chrono> 
    #include <thread> 
    
    int main() 
    { 
        for(int i=1;i<=3;++i) 
        { 
                std::this_thread::sleep_for(std::chrono::seconds(1)); 
                std::cout<<i<<std::endl; 
        } 
    }
    

    Das ist C++11. Was du da hast, ist genau was Boost auch ohne C++11 zur Verfügung stellt. Und bitte mit Leerzeichen, ist ja eklig...



  • Nymer, welchem Compiler benutzt du?
    Mein GCC 4.7.1 sagt

    In function 'int main()':
    error: 'std::this_thread' has not been declared
    ||=== Erstellen beendet: 1 Fehler, 0 Warnungen===
    

    Deswegen geb ich kaum Hinweise in Richtung C++11, weil viele Anfänger ja sogar noch ältere Compiler benutzen. Aber vergessen hab ichs auch... Kommt wohl davon, wenn man Sachen, die nicht funktionieren, nicht benutzt...



  • Natürlich funktioniert das. Du musst einfach nur <thread> includen und mit -std=c++0x kompilieren. (Hat 4.7 schon -std=c++11?)



  • cooky451 schrieb:

    (Hat 4.7 schon -std=c++11?)

    http://gcc.gnu.org/gcc-4.7/cxx0x_status.html schrieb:

    This support can be enabled with the -std=c++11 or -std=gnu++11 compiler options; the former disables GNU extensions.

    Icognito hat aber das Beispiel kopiert, oder? Dann hat er das Flag vergessen.



  • Hab ich beides gemacht (soweit ich weiß ist std=c++0x im neuen GCC sowieso standadgemäß aktiviert). Er sagt ja auch nicht, dass die Header nicht da sind oder sowas. Aber ich kann nix benutzen davon:

    #include <thread>
    
    int main()
    {
        std::thread t;
    }
    
    In function 'int main()':|
    error: 'thread' is not a member of 'std'|
    error: expected ';' before 't'|
    ||=== Erstellen beendet: 2 Fehler, 0 Warnungen===|
    

    Mit -std=c++0x, -Wall, -pedantic, -s und -O3.

    GCC 4.7.1



  • Ja, nimm -std=c++11.
    Außerdem: Ja, es ist schade aber so wie es aussieht unterstützt MinGW nicht alles, was GCC unterstützt. (Ob das hier zutrifft weiß ich nicht)



  • Mit -std=c++11:

    In function 'int main()':|
    error: 'thread' is not a member of 'std'|
    error: expected ';' before 't'|
    ||=== Erstellen beendet: 2 Fehler, 0 Warnungen===||
    


  • Hast du denn MinGW?





  • Kann das ein Mod absplitten, in das Compiler/IDE-Forum?



  • Du musst gegen pthread linken, da das sonst dummerweise nicht funktioniert. (gcc (Ubuntu/Linaro 4.7.0-7ubuntu3) 4.7.0)



  • Was meinst du mit "gegen pthread linken"? Außerdem kommt der Linker ja gar nicht erst dran, weil doch der Compiler was meckert.



  • Als Flag -pthread .
    Zumindest unter Ubuntu, unter Windows weiss ich es leider nicht genau.



  • Nymer schrieb:

    Schleife? Wie in Nymers Beispiel.

    #include <iostream> 
    #include <chrono> 
    #include <thread> 
    
    int main() 
    { 
        for(int i=1;i<=3;++i) 
        { 
                std::this_thread::sleep_for(std::chrono::seconds(1)); 
                std::cout<<i<<std::endl; 
        } 
    }
    

    Wenn ich es so mache kommt folgendes:

    fatal error C1083: Datei (Include) kann nicht geöffnet werden: "chrono": No such file or directory
    

    Ich benutze übrigens "Microsoft Visual C++".



  • So, Icognito, mein GCC 4.8 kompiliert das problemlos...


Anmelden zum Antworten