zoukankan      html  css  js  c++  java
  • boost.asio系列(一)——deadline_timer

    一.构造函数

      一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维护多个定时器。在构造deadline_timer时指定时间:

    1 basic_deadline_timer(boost::asio::io_service & io_service);
    2 
    3 basic_deadline_timer( boost::asio::io_service & io_service,
    4     const time_type & expiry_time);
    5 
    6 basic_deadline_timer(boost::asio::io_service & io_service,
    7     const duration_type & expiry_time);

    二.同步定时器

      由于不涉及到异步,该函数和io_service没有什么关系。只是简单的sleep。

    1 boost::asio::io_service io;  
    2 boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));  
    3 t.wait(); 

    三.异步定时器

      由于涉及到异步,该函数需要io_service来运行run,进行调度。

    1 boost::asio::io_service io;  
    2 boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));  
    3 t.async_wait(handler);

    四.例子

     1 #include<boost/asio.hpp>
     2 #include<boost/ref.hpp>
     3 #include<iostream>
     4 
     5 
     6 using namespace std;
     7 typedef function<void (const boost::system::error_code&)> timer_callback ;
     8 
     9 void print(const boost::system::error_code&)
    10 {
    11     cout << "async timer."<<endl;
    12 }
    13 
    14 void bindPrint(const boost::system::error_code & err,boost::asio::deadline_timer &timer)
    15 {
    16     cout<<"bind loop async timer."<<endl;
    17     timer.expires_at(timer.expires_at() + boost::posix_time::seconds(5));
    18     timer.async_wait(std::bind(bindPrint, std::placeholders::_1, boost::ref(timer)));
    19 }
    20 
    21 
    22 int main()
    23 {
    24     boost::asio::io_service io;
    25 
    26     //1.基本的同步定时器
    27     boost::asio::deadline_timer timer1(io, boost::posix_time::seconds(5));
    28     timer1.wait();
    29 
    30     //2.基本的异步定时器
    31     boost::asio::deadline_timer timer2(io, boost::posix_time::seconds(5));
    32     timer2.async_wait(print);
    33 
    34     //3.使用lambda来生成回调函数
    35     boost::asio::deadline_timer timer3(io, boost::posix_time::seconds(5));
    36     timer_callback callback = [&](const boost::system::error_code& err)
    37     {
    38         cout<<"lambda loop async timer."<<endl;
    39         timer3.expires_at(timer3.expires_at() + boost::posix_time::seconds(5));
    40         timer3.async_wait(callback);
    41     };
    42     timer3.async_wait(callback);
    43 
    44     //4.使用bind来生成回调函数
    45     boost::asio::deadline_timer timer4(io, boost::posix_time::seconds(5));
    46     timer4.async_wait(std::bind(bindPrint, std::placeholders::_1, boost::ref(timer4)));
    47 
    48     io.run();
    49     return 0;
    50 }

     五.补充

    1.deadline_timer的计时是在定义后,即timer构造函数完成后就开始,而不是调用wait()或者async_wati()后开始计时。

    2.deadline_timer不能进行拷贝的,所以在bind中必须使用boost::ref进行包裹。

  • 相关阅读:
    S02_CH09_UART串口中断实验
    S02_CH08_ ZYNQ 定时器中断实验
    S02_CH07_ ZYNQ PL中断请求
    S02_CH06_XADC实验
    S02_CH05_UBOOT实验Enter a post title
    S02_CH04_User_IP实验Enter a post title
    S02_CH03_EMIO实验Enter a post title
    S02_CH02_MIO实验Enter a post title
    S02_CH01_Hello World实验
    bzoj4868 [Shoi2017]期末考试
  • 原文地址:https://www.cnblogs.com/cauchy007/p/5079952.html
Copyright © 2011-2022 走看看