简单的几个Boost定时器

时间:2024-07-12 23:36:38

  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 吧。

  下面看示例:

  

 #include <iostream>
#include <chrono>
#include <thread>
#include <boost/asio.hpp> #include <boost/asio/high_resolution_timer.hpp >
#include <boost/asio/steady_timer.hpp >
#include <boost/asio/system_timer.hpp > class printer {
private:
boost::asio::io_service io_;
boost::asio::steady_timer timer_;
int count_;
void print() {
if (count_ < ) {
std::cout << count_ << "\n";
++count_; timer_.expires_from_now(std::chrono::milliseconds ());
timer_.async_wait(std::bind(&printer::print, this));
}
else
{
std::cout << "Final count is " << count_ << "\n";
delete this;
}
}
void run() {
timer_.expires_from_now(std::chrono::milliseconds ());
timer_.async_wait(std::bind(&printer::print, this));
io_.run();
}
printer()
: timer_(io_),
count_() { }
~printer() { } public: static printer* Create(){
return new printer;
} void start() {
std::thread t;
t = std::thread(std::mem_fn(&printer::run), this);
t.detach();
}
};
void foo()
{
printer *p = printer::Create();
p->start();
}
int main() {
foo();
std::cin.get();
return ;
}

  

  该代码在 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++ -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

  

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

  

  

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

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

  

  

 #include <iostream>
#include <chrono>
#include <thread>
#include <boost/asio.hpp> #include <boost/asio/high_resolution_timer.hpp >
#include <boost/asio/steady_timer.hpp >
#include <boost/asio/system_timer.hpp > class printer2 {
private:
boost::asio::steady_timer timer_;
int count_;
void print() {
if (count_ < ) {
std::cout << count_ << "\n";
++count_; timer_.expires_from_now(std::chrono::milliseconds ());
timer_.async_wait(std::bind(&printer2::print, this));
}
else
{
std::cout << "Final count is " << count_ << "\n";
delete this;
}
}
printer2(boost::asio::io_service &io)
: timer_(io,std::chrono::milliseconds ()),
count_() {
timer_.async_wait(std::bind(&printer2::print, this)); }
~printer2() { } public: static printer2* Create(boost::asio::io_service &io){
return new printer2(io);
} }; int main() {
boost::asio::io_service io;
printer2::Create(io);
printer2::Create(io);
printer2::Create(io);
printer2::Create(io);
io.run();
std::cin.get();
return ;
}

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

  

  DevC++ 5.9.1 with Boost 1.57.0