博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的几个Boost定时器
阅读量:4589 次
发布时间:2019-06-09

本文共 3350 字,大约阅读时间需要 11 分钟。

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

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

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

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

 

  下面看示例:

 

  

1 #include 
2 #include
3 #include
4 #include
5 6 7 #include
8 #include
9 #include
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_ << "\n";20 ++count_;21 22 timer_.expires_from_now(std::chrono::milliseconds (50));23 timer_.async_wait(std::bind(&printer::print, this));24 }25 else26 {27 std::cout << "Final count is " << count_ << "\n";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             = timerOBJ             = main.oLINKOBJ         = -pthread -lboost_systemCXXINC          = CXXFLAGS        = $(CXXINC) -std=c++11 -O3 -WallRM              = rm -f$(BIN):$(OBJ)        $(CXX)  $(CXXFLAGS) $(OBJ) $(LINKOBJ) -o $(BIN)%.o:%.cpp        $(CXX) $(CXXFLAGS) -c $
View Code

 

  

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

  

  

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

 

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

  

  

1 #include 
2 #include
3 #include
4 #include
5 6 7 #include
8 #include
9 #include
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_ << "\n";19 ++count_;20 21 timer_.expires_from_now(std::chrono::milliseconds (500));22 timer_.async_wait(std::bind(&printer2::print, this));23 }24 else25 {26 std::cout << "Final count is " << count_ << "\n";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 绿色包

  

 

  

  

 

 

  

 

转载于:https://www.cnblogs.com/lyqf365/p/4285166.html

你可能感兴趣的文章
Java大数相乘-hdu1063
查看>>
mysql-mmm 部署高可用集群
查看>>
solaris启动过程详解 分类: arm-linux-Ubuntu ...
查看>>
while循环和递归
查看>>
Linux下yum安装Redis
查看>>
.Net 下未捕获异常的处理
查看>>
[机器学习]-Adaboost提升算法从原理到实践
查看>>
AOP概念
查看>>
memset函数详细用法说明【转】
查看>>
php解析xml字符串
查看>>
SFTP客户端与服务端
查看>>
Modbus协议
查看>>
复位自动ID的问题有兩種方法
查看>>
CentOS 5.5 Samba服务器安装总结
查看>>
博客园评价
查看>>
Apache commons-io实现多文件读取和写入
查看>>
Bash快捷键整理
查看>>
不写代码也能爬虫Web Scraper
查看>>
转: C#+MAPX 添加线、文本、符号等图元
查看>>
管理机--Jumpserver由docker搭建
查看>>