web-dev-qa-db-ja.com

C ++ Boost ASIOシンプル定期タイマー?

50msごとにコードを呼び出す非常にシンプルな定期タイマーが必要です。常に50ミリ秒スリープするスレッドを作成できます(しかし、それは苦痛です)...タイマーを作成するためのLinux APIを調べ始めることができます(ただし、移植性はありません)...

ブーストを使用するにはlikeを使用します。可能かどうかはわかりません。 boostはこの機能を提供しますか?

25
Scott

Boosts Asioチュートリアルの2番目の例で説明しています。
あなたはそれを見つけることができます ここ

その後、 番目の例を確認してください を定期的な時間間隔で再度呼び出す方法を確認しますl

19
Default

非常にシンプルだが完全に機能する例:

_#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;
}
_

expires_at()を呼び出して新しい有効期限を設定することが非常に重要であることに注意してください。そうしないと、現在の期限がすでに切れているため、タイマーがすぐに起動します。

24
Lucio Paiva

この単純な例をさらに拡張します。コメントで述べたように実行をブロックするので、さらにio_servicesを実行したい場合は、そのようなスレッドで実行する必要があります...

boost::asio::io_service io_service;
boost::asio::io_service service2;
timer.async_wait(tick);
boost::thread_group threads;
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
service2.run();
threads.join_all();
0
jaxkewl

以前の回答でいくつかの問題があったので、これが私の例です:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

void print(const boost::system::error_code&, boost::asio::deadline_timer* t,int* count)
{
    if (*count < 5)
    {
        std::cout << *count << std::endl;
        ++(*count);
        t->expires_from_now(boost::posix_time::seconds(1));
        t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count));
    }
}

int main()
{ 
    boost::asio::io_service io;
    int count = 0;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));

    t.async_wait(boost::bind(print, boost::asio::placeholders::error, &t, &count));

    io.run();
    std::cout << "Final count is " << count << std::endl;

    return 0;

}

それはそれがすることになっていたことをしました:5まで数えます。それは誰かを助けるかもしれません。

0
Simon Pfister