C++ Logo


Advanced search

Proposal : std::timer

From: <contact_at_[hidden]>
Date: Fri, 10 Jan 2020 23:28:04 +0000 (UTC)
I hope you're well and you enjoy 2020. I'm writing you a short message about a C++ proposal. Of course, the C++ is my favorite programming language and I have an idea about a new std class or struct that doesn't yet exist. I think it could be cool to have a std::timer similar to the win32 timer (https://docs.microsoft.com/en-us/windows/win32/winmsg/using-timers) or the qt timer (https://doc.qt.io/qt-5/qtimer.html) or the GLUT timer (https://linux.die.net/man/3/gluttimerfunc) or ...
The implementation can be discuted of course. It can use std::chrono, std::thread, std::function and more.
This is a draft.
namespace std
class timer

 timer(); // constructor

// ANOTHER VERSION OF THE CONSTRUCTORS : THE ADVANCED VERSION with which thread to use for the call of the callback
 timer(); // will call the callback on the main thread (or the thread where the timer has been constructed)
 timer(thread_id); // will use this thread_id for the call of the callback

 virtual ~timer(); // stop and destroy

 void start_once(function, when = 0); // will call the callback named function after a fixed duration
 void start_interval(function, interval_duration, nbTimes, when = 0); // will call the callback nb times every 'interval_duration' after a fixed duration
 void restart(); // stop the timer and call start_xxx with the last used params
 void stop(); // stop the timer but the restart can do something
 void cancel(); // stop the timer but the restart does nothing
 bool is_active() const; // start_xxx has_been used and the timer is still active
 bool can_restart() const; // restart can be used
 // ...
I added 1 example :

Example #1

Sometime in UI developement (or in network), you need a timer. At the end of the timer (like a timeout), a callback will be called. This version helps to write less code and with an easy manner.
I put a small example : You want to know when the user stopped to move the mouse.
The pseudo c++ code is here :
class MyMainWindow : public Framework::Window
    this->SetMouseMove(MyMainWindow::OnMouseMove); // set the event handler
    // set the timer to 3 seconds
      timer.start_once(MyMainWindow::DoTheAction, 3s);
    timer.stop(); // stop it now
 static void OnMouseMove(...)
    // reset the timer
    timer.restart(); // will call timer.stop() and timer.start_once() with the last used params
 static void DoTheAction()
    std::cout << "the user stopped to move the mouse since 3 secondes" << std::endl;
    // ... do the other stuffs ...

 std::timer timer;

Remark 1 : There are also another "Timer" that gives the elapsed time between a start/stop (used for benchmark) like the Boost Timer (https://www.boost.org/doc/libs/1_53_0/libs/timer/doc/index.html). Herb sent me this link. Thanks. We need to take in consideration the 'good naming' of course.

Remark 2 : I don't yet talk about the implementation and the accuracy. I'm waiting that this proposal is accepted.

What do you think ?


Received on 2020-01-10 17:30:40