QTimer::start(int)



  • Ich wollte nur mal sagen, dass ich die Implementierung davon richtig Kacke finde. Wieso? Wegen dem int als Parameter. Ich hab fast ne Stunde nach nem Fehler gesucht, wo der Intervall des QTimer 's negativ war, dabei war es nur so eine große Zahl, dass es einen Overflow provoziert hat. Meiner Meinung nach sollte es QTimer::start(qint64) lauten - genau der Datentyp, der QTimer::msecsTo() zurückgibt.

    Jetzt kann ich ne eigene Timer-Klasse für meine TODO-Liste bauen - na toll!



  • Wer brauchst schon Tag beim Timer wenn man von 32Bit ausgeht?
    Warum prüfst du die Zahl nicht vorher?



  • Sillo schrieb:

    Wer brauchst schon Tag beim Timer wenn man von 32Bit ausgeht?

    Jemand, der ne TODO-Liste oder nen Wecker schreibt.

    Warum prüfst du die Zahl nicht vorher?

    Mit welcher Fehlermeldung denn, wenn es zu einem Überlauf kommen soll?
    "Tut mir Leid aber Sie können kein Wecker erstellen, der erst in einem Monat Alarm schlägt."?


  • Mod

    Glaube nicht das Timer für so lange Zeit perioden wirklich praktisch sind.
    Lade lieber jeden Tag die Timer welche an diesem Tag fällig sind, brauchst du nur einen 24h timer um dies einmal zu tun...

    Evtl. ist boost::asio::deadline_timer eine alternative:
    http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/deadline_timer.html



  • Ja, aber stell dir vor ich mach jedes Mal nen Suspend, statt nen Shutdown.
    Nee, dann bau ich lieber nen eigenen Timer, oder benutze den von Boost.



  • EDIT: Stimmt, dann brauch ich noch nen zusätzlichen Timer.
    Aber trotzdem, ich benutz lieber was Eigenes.


  • Mod

    Bin auf deine Implementation gespannt, boost nutzt long, welches je nach Plattfrom 32 oder 64 bit ist...



  • Du kannst den Timer auch jede Sekunde durchlaufen lassen und prüfen ob was anliegt. Soviel Events wird ein Wecker wohl nicht haben.



  • phlox81 schrieb:

    Bin auf deine Implementation gespannt, boost nutzt long, welches je nach Plattfrom 32 oder 64 bit ist...

    Najo, ich bau mir halt was eigenes mit std::size_t .

    Und ich hab gleich Probleme damit, weil ich kenne mich mit std::chrono und Zeitberechnung nicht so recht aus.
    Wie mache ich den Template-Parameter "rep" zu std::size_t ?

    Ich hab folgendes ausprobiert:

    using duration_type = std::chrono::duration<std::size_t>;
        using time_point = std::chrono::time_point<std::chrono::high_resolution_clock, duration_type>;
    

    Aber das ist nicht richtig so.

    Hier noch die ganze Klasse, falls es noch mehr anzumeckern gibt:

    #ifndef COLLECTION_TIMER_HPP
    #define COLLECTION_TIMER_HPP
    
    #include <functional>
    #include <chrono>
    
    class timer{
        using duration_type = std::chrono::duration<std::size_t>;
        using time_point = std::chrono::time_point<std::chrono::high_resolution_clock, duration_type>;
    
        time_point current, paused;
    
    public:
        std::function<void()> callback;
        std::size_t interval;
        bool single{false};
    
        void start(){
            current = std::chrono::high_resolution_clock::now();
        }
    
        void pause(bool enable = true){
            if(enable && paused != time_point{})
                paused = std::chrono::high_resolution_clock::now();
    
            else if(!enable){
                current += std::chrono::high_resolution_clock::now() - paused;
                paused = time_point{};
            }
        }
    
        void check(){
            if(current == time_point{})
                return;
    
            auto duration = std::chrono::duration_cast<std::chrono::duration<std::size_t, std::milli>>(std::chrono::high_resolution_clock::now() - current);
    
            if(paused == time_point{} && duration.count() >= interval){
                callback();
    
                if(!single)
                    start();
                else
                    current = time_point{};
            }
        }
    
        bool timeout() const{
            auto duration = std::chrono::duration_cast<std::chrono::duration<std::size_t, std::milli>>(std::chrono::high_resolution_clock::now() - current);
            return paused == time_point{} && duration.count() >= interval;
        }
    };
    
    #endif
    

    Ich wills wirklich sauber haben.
    Und ich finde auch nirgends, welcher Typ "rep" eigentlich ist, wenns ne high_resolution_clock ist. Habe nichts in der Referenz dazu gefunden.

    Kannst du mir sagen, was ich falsch mache?



  • Kann ein Moderator hier den letzten Beitrag, diesen inkludiert, löschen, bitte?



  • Jemand, der ne TODO-Liste oder nen Wecker schreibt.

    Mal ehrlich, nen Tag hat 24*3600 = 86400 sekunden = 86400000 millis
    das geht in nen int

    Du willst echt nicht für Zeiträume über mehrere Tage nen timer aufziehen oder ?
    Glaub das geht bissi am Sinn und Zweck von timern vorbei 🙂

    Du kannst den Timer auch jede Sekunde durchlaufen lassen und prüfen ob was anliegt. Soviel Events wird ein Wecker wohl nicht haben.

    Genau ...
    Im Sekundenrythmus Zeit abfragen und gegen ne variable vergleichen und dann wieder Schlafen gehen ist für Programme eher üblich als ein vergehen 🙂

    Und falls du richtig professioniell werden willst, nutze die Möglichkeiten deiner Umgebung ^^ Jedes OS bringt ne Art scheduler (Aufgabenverwaltung, Cron) mit, den man meist auslesen und bearbeiten kann ... das funktioniert meist dann auch, wenn dein programm abgeschossen wurde. Da kann man meist auch sein progg wieder starten lassen.
    Je nachdem was man will. Willst ne Super duper Anzeige der verbliebenden Zeit bis zum Weckzeitpunkt bauen, klar dann solltest natürlich keinen fremden scheduler nutzen ...

    Ciao ...



  • Ich hab jetzt nen zusätzlichen Day-Timer einprogrammiert, der immer nur die Timer des Tages aktiviert, der Rest bleibt unberührt.


Anmelden zum Antworten