繁体   English   中英

用boost :: asio创建计时器

[英]Create timer with boost::asio

我想创建执行每秒1次的定期任务。 但就我而言,boost :: asio :: deadline_timer不应为全局变量。

boost::asio::io_service _io;

void handler(const boost::system::error_code, int a) {
    boost::asio::deadline_timer timer(_io);
    //do task
    timer.expires_from_now(boost::posix_time::seconds(1));
    timer.async_wait(std::bind(handler, _1, a));
}

boost::asio::deadline_timer timer(_io);
timer.expires_from_now(boost::posix_time::seconds(1));
timer.async_wait(std::bind(handler, _1, 1));

更新我明白了。 您要动态分配计时器吗?

生活在Coliru

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

using namespace boost;
using Timer = shared_ptr<asio::deadline_timer>;

asio::io_service _io;

void handler(int a, const system::error_code& = {}, Timer timer = make_shared<Timer::element_type>(_io)) {
    std::cout << "hello world\n";
    timer->expires_from_now(posix_time::seconds(1));
    timer->async_wait(bind(handler, a, asio::placeholders::error, timer));
}

int main() {
    handler(42);
    _io.run();
}

技巧是boost::bind绑定到boost::shared_ptr并保留其副本-延长计时器对象的寿命


截止时间计时器,每秒触发一次,不使用任何全局变量:

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

using namespace boost;

int main() {

    thread t([] {
            asio::io_service io;
            asio::deadline_timer dt(io, posix_time::seconds(1));
            function<void(system::error_code)> ll = [&](system::error_code ec) {
                if (!ec) {
                    puts("hello world");
                    dt.expires_from_now(posix_time::seconds(1));
                    dt.async_wait(ll);
                }
            };
            ll({});
            io.run();
        });

    this_thread::sleep_for(chrono::seconds(2));
    std::cout << "async\n";

    t.join();
}

输出:

Hello world
Hello world
async
Hello world
Hello world
....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM