Code Example
#include <iostream>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int snyc_timer()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(2));
t.wait();
std::cout << "Hello, world!" << std::endl;
return 0;
}
void print2(const boost::system::error_code& )
{
std::cout << "thread #" << boost::this_thread::get_id() << std::endl;
std::cout << "Hello, world!" << std::endl;
}
int asnyc_timer()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(2));
t.async_wait(&print2);
std::cout << "[main thread] #" << boost::this_thread::get_id() << std::endl;
std::cout << "here" << std::endl;
io.run();
return 0;
}
void print(const boost::system::error_code& ,
boost::asio::deadline_timer* t, int* count)
{
if (*count < 5)
{
std::cout << *count << std::endl;
++(*count);
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
t->async_wait(boost::bind(print,
boost::asio::placeholders::error, t, count));
}
}
int asnyc_timer_with_params()
{
boost::asio::io_service io;
int count = 0;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
t.async_wait(boost::bind(print,
boost::asio::placeholders::error, &t, &count));
io.run();
std::cout << "Final count is " << count << std::endl;
return 0;
}
class printer
{
public:
printer(boost::asio::io_service& io)
: timer_(io, boost::posix_time::seconds(1)),
count_(0)
{
timer_.async_wait(boost::bind(&printer::print, this));
}
~printer()
{
std::cout << "Final count is " << count_ << std::endl;
}
void print()
{
if (count_ < 5)
{
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1));
timer_.async_wait(boost::bind(&printer::print, this));
}
else {
std::cout << "print do nothing..." << std::endl;
}
}
private:
boost::asio::deadline_timer timer_;
int count_;
};
int asnyc_timer_with_class_method()
{
boost::asio::io_service io;
printer p(io);
io.run();
return 0;
}
class printer_sync
{
public:
printer_sync(boost::asio::io_service& io)
: strand_(io),
timer1_(io, boost::posix_time::seconds(1)),
timer2_(io, boost::posix_time::seconds(1)),
count_(0)
{
timer1_.async_wait(strand_.wrap(boost::bind(&printer_sync::print1, this)));
timer2_.async_wait(strand_.wrap(boost::bind(&printer_sync::print2, this)));
}
~printer_sync()
{
std::cout << "Final count is " << count_ << std::endl;
}
void print1()
{
if (count_ < 10)
{
std::cout << "Timer 1: " << count_ <<",thread #" << boost::this_thread::get_id() << std::endl;
++count_;
timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
timer1_.async_wait(strand_.wrap(boost::bind(&printer_sync::print1, this)));
}
else {
std::cout << "Timer 1: else " << count_ << std::endl;
}
}
void print2()
{
if (count_ < 10)
{
std::cout << "Timer 2: " << count_ << ",thread #" << boost::this_thread::get_id() << std::endl;
++count_;
timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
timer2_.async_wait(strand_.wrap(boost::bind(&printer_sync::print2, this)));
}
else {
std::cout << "Timer 2: else " << count_ << std::endl;
}
}
private:
boost::asio::io_service::strand strand_;
boost::asio::deadline_timer timer1_;
boost::asio::deadline_timer timer2_;
int count_;
};
int sync_handlers()
{
boost::asio::io_service io;
printer_sync p(io);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
std::cout << "[main thread] #" << boost::this_thread::get_id() << std::endl;
std::cout << "[1] begin to run" << std::endl;
io.run();
std::cout << "[2] after run" << std::endl;
t.join();
std::cout << "[3] after join" << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
sync_handlers();
return 0;
}
Reference
History