• 简单的几个Boost定时器


      boost 的asio库里有几个定时的器,老的有 deadline_timer , 还有三个可配合 C++11 的 chrono 使用的 high_resolution_timer  、 steady_timer  和 system_timer 。

      老的 deadline_timer 我不太想用了,因为用起来没有后面三个好用。但是后面三个没有 C++ 11 也不好用。

      C++ 之父 曾建议 老的程序应该用最新的编译器在C++ 11的标准下重新编译一遍,当然,他还补充说是在成本上允许的情况下,如果你的老程序是长年累月一点点编译 和增长起来的,重新编译可能不现实。 但是新的 C++ 项目,应该优先使用 C++11的标准来实现。

      这里仅简单介绍一下 后三个 中的任意一个,因为它们实现相似到很难看出区别。除非在极端的条件下,后三个用哪一个都差不多,如果你不知道用哪个,那就用  steady_timer 吧。

      下面看示例:

      

     1 #include <iostream>
     2 #include <chrono>
     3 #include <thread>
     4 #include <boost/asio.hpp>
     5 
     6 
     7 #include <boost/asio/high_resolution_timer.hpp >
     8 #include <boost/asio/steady_timer.hpp >
     9 #include <boost/asio/system_timer.hpp >
    10 
    11 
    12 class printer {
    13     private:
    14         boost::asio::io_service io_;
    15         boost::asio::steady_timer timer_;
    16         int count_;
    17         void print() {
    18             if (count_ < 500) {
    19                 std::cout << count_ << "
    ";
    20                 ++count_;
    21 
    22                 timer_.expires_from_now(std::chrono::milliseconds (50));
    23                 timer_.async_wait(std::bind(&printer::print, this));
    24             }
    25             else
    26             {
    27                 std::cout << "Final count is " << count_ << "
    ";
    28                 delete this;
    29             }
    30         }
    31         void run() {
    32             timer_.expires_from_now(std::chrono::milliseconds (50));
    33             timer_.async_wait(std::bind(&printer::print, this));
    34             io_.run();
    35         }
    36         printer()
    37             : timer_(io_),
    38               count_(0) {
    39 
    40         }
    41         ~printer() {
    42             
    43         }
    44 
    45     public:
    46 
    47         static printer* Create(){
    48             return new printer;
    49         }
    50     
    51         void start() {
    52             std::thread t;
    53             t = std::thread(std::mem_fn(&printer::run), this);
    54             t.detach();
    55         }
    56 };
    57 void foo()
    58 {
    59     printer *p = printer::Create();
    60     p->start();
    61 }
    62 int main() {
    63     foo();
    64     std::cin.get();
    65     return 0;
    66 }
    View Code

      

      该代码在 windows 下使用 tdm-gcc 4.8.1 配合 boost 1.57.0 编译通过并运行。 链接时需要 wsock32 库 和 boost-system 库 ( -lboost_system -lwsock32)

      

      源代码存为main.cpp,下面是linux下的makefile (centos 7.0 系统自带的 gcc 和 boost 1.5.70

     

    CXX             = g++
    BIN             = timer
    OBJ             = main.o
    LINKOBJ         = -pthread -lboost_system
    CXXINC          = 
    CXXFLAGS        = $(CXXINC) -std=c++11 -O3 -Wall
    RM              = rm -f
    
    $(BIN):$(OBJ)
            $(CXX)  $(CXXFLAGS) $(OBJ) $(LINKOBJ) -o $(BIN)
    
    %.o:%.cpp
            $(CXX) $(CXXFLAGS) -c $<
    
    clean:
            $(RM) $(OBJ) $(BIN)
    
    rebuild:
            make clean
            make
    View Code

      

      定时器的用法也是比较简单的,基本上分三步。创建 io_service , 创建timer 并设置等待时间, 调用wait 或async_wait 等待.

      

      

      其中wait是同步等待,async_wait是异步等待,需要给一个回调给它。

      同一个 io_service 可以同时给多个 timer使下,看下面的示例

      

      

     1 #include <iostream>
     2 #include <chrono>
     3 #include <thread>
     4 #include <boost/asio.hpp>
     5 
     6 
     7 #include <boost/asio/high_resolution_timer.hpp >
     8 #include <boost/asio/steady_timer.hpp >
     9 #include <boost/asio/system_timer.hpp >
    10 
    11 
    12 class printer2 {
    13     private:
    14         boost::asio::steady_timer timer_;
    15         int count_;
    16         void print() {
    17             if (count_ < 10) {
    18                 std::cout << count_ << "
    ";
    19                 ++count_;
    20 
    21                 timer_.expires_from_now(std::chrono::milliseconds (500));
    22                 timer_.async_wait(std::bind(&printer2::print, this));
    23             }
    24             else
    25             {
    26                 std::cout << "Final count is " << count_ << "
    ";
    27                 delete this;
    28             }
    29         }
    30         printer2(boost::asio::io_service &io)
    31             : timer_(io,std::chrono::milliseconds (500)),
    32               count_(0) {
    33                 timer_.async_wait(std::bind(&printer2::print, this));
    34 
    35         }
    36         ~printer2() {
    37             
    38         }
    39 
    40     public:
    41 
    42         static printer2* Create(boost::asio::io_service &io){
    43             return new printer2(io);
    44         }
    45     
    46 
    47 };
    48 
    49 int main() {
    50     boost::asio::io_service io;
    51     printer2::Create(io);
    52     printer2::Create(io);
    53     printer2::Create(io);
    54     printer2::Create(io);
    55     io.run();
    56     std::cin.get();
    57     return 0;
    58 }
    View Code

      下面附上我打包好的devcpp 绿色包

      

      DevC++ 5.9.1 with Boost 1.57.0

      

      

  • 相关阅读:
    UML类图学习总结
    Java和C# RSA加解密相互通信和使用公钥加密传输
    C#des加密算法指定键的大小对于此算法无效
    WCF--找不到具有绑定 BasicHttpBinding 的终结点的与方案 https 匹配的基址。注册的基址方案是 [http]。
    IIS7 使用server farms 进行负载均衡
    iis7 未注册framework4 导致 莫名的404错误
    启用代理导致 有道云笔记未知错误、网络错误和OneDrive断线
    AspNetCore发布到Centos7
    c# 操作临时数据---XML操作
    c# 获取程序目录
  • 原文地址:https://www.cnblogs.com/lyqf365/p/4285166.html
Copyright © 2020-2023  润新知