2010-11-24 13 views
20

Ich möchte einen sehr einfachen periodischen Timer, um alle 50ms meinen Code aufzurufen. Ich könnte einen Thread machen, der die ganze Zeit für 50ms schläft (aber das ist ein Schmerz) ... Ich könnte anfangen, Linux-APIs für Timer zu suchen (aber es ist nicht tragbar) ...C++ Boost ASIO einfacher periodischer Timer?

Ich würde wie Boost zu verwenden. Ich bin nur nicht sicher, dass es möglich ist. Bietet Boost diese Funktionalität?

Antwort

18

Das zweite Beispiel auf Boosts Asio tutorials erklärt es.
Sie können es here finden.

Danach werden check the 3rd example zu sehen, wie Sie es noch einmal mit einem periodischen Zeitintervall

+0

Diese Links führen zu einem Fehler 404. –

+1

@PhilippLudwig danke für die Benachrichtigung. Sie scheinen das Verknüpfungsformat geändert zu haben. Ich aktualisierte die Links – Default

+0

Danke für das schnelle Update :) –

17

Ein sehr einfaches, voll funktionsfähiges Beispiel nennen:

#include <iostream> 
#include <boost/asio.hpp> 

boost::asio::io_service io_service; 
boost::posix_time::seconds interval(1); // 1 second 
boost::asio::deadline_timer timer(io_service, interval); 

void tick(const boost::system::error_code& /*e*/) { 

    std::cout << "tick" << std::endl; 

    // Reschedule the timer for 1 second in the future: 
    timer.expires_at(timer.expires_at() + interval); 
    // Posts the timer event 
    timer.async_wait(tick); 
} 

int main(void) { 

    // Schedule the timer for the first time: 
    timer.async_wait(tick); 
    // Enter IO loop. The timer will fire for the first time 1 second from now: 
    io_service.run(); 
    return 0; 
} 

Beachten Sie, dass es sehr wichtig ist expires_at() zu rufen Legen Sie eine neue Ablaufzeit fest, ansonsten wird der Timer sofort ausgelöst, da die aktuelle Fälligkeit bereits abgelaufen ist.

+0

wird dies funktionieren, wenn die Systemzeit geändert wird? – AndrewStone

+0

@AndrewStone Ich denke nicht, aber wenn Sie sich darüber Sorgen machen, können Sie stattdessen einen stabilen Timer verwenden, der nicht von Änderungen der Systemzeit beeinflusst wird. Schau mal hier: http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/steady_timer.html Es sollte einfach sein, mein Beispiel oben zu portieren, um es zu benutzen. –

+0

ja, danke! der stetige Timer funktionierte – AndrewStone