这篇博文中的示例代码简单演示了如何结合 Boost 中的 bind 与 Boost.Asio 中的异步方法来实现简单的异步处理方法.
代码简单的模拟了编译器编译源文件的过程,其异步操作的进度是按照时间顺序进行的,程序的大致流程如下所示:
首先,compiler 运行,执行异步事件链中的首个异步操作----> 读入带编译的源文件
读入源文件之后-----> 等待 2 s ------> 执行异步事件链中的第二个事件 ------> 编译读入的源文件
编译源文件之后 -----> 等待 2 s -----> 执行异步事件链中的第三个事件 -------> 执行链接、绑定操作
连接绑定操作之后-----> 等待 2 s ----> 执行异步事件链中的第四个事件 ------> 执行运行编译生成的可执行程序
到达截止时间,程序结束运行,输出结束语并结束程序.
示例代码如下
-
#include <iostream>
-
#include <boost/asio.hpp>
-
#include <boost/bind.hpp>
-
#include <boost/date_time/posix_time/posix_time.hpp>
-
-
class compiler
-
{
-
public :
-
compiler ( boost::asio::io_service &io ):
-
timer_(io,boost::posix_time::seconds(1)) ,counter_(0)
-
{
-
timer_.async_wait( boost::bind(&compiler::read_in_source_file ,this) ) ;
-
// timer_ 是 boost::deadline_timer 的实例对象,在这里调用 async_wait 该成员方法
-
// 目的是为了在截止时间到来的时候调用 其内部绑定的 compiler 类中的成员方法 read_in_source_file
-
//-------
-
// 这里的 bind 方法的使用因为其绑定的是类-成员方法而区别于普通方法的绑定
-
// bind 的第一个参数是 类名称::被绑定的类成员方法名称
-
// bind 的第二个参数是 类对象实例,因为绑定操作发生在 类内部,所以传入的是 this ,this 用于在类内部表示类实例对象
-
// 类似于 java 编程中的 this.name = name ; 这种构造方法中的赋值操作
-
}
-
-
~compiler ()
-
{
-
std::cout << "finish compiling " << std::endl ;
-
}
-
-
void read_in_source_file ()
-
{
-
std::cout << " read in source file " << std::endl ;
-
-
timer_.expires_at( timer_.expires_at() + boost::posix_time::seconds(2) ) ;
-
// 在这里将截止时间延迟 2 秒,2 秒过后将会调用绑定的 compile_source_file 函数
-
-
timer_.async_wait (boost::bind(&compiler::compile_source_file , this ) ) ;
-
}
-
-
void compile_source_file ()
-
{
-
std::cout << "compiling source file " << std::endl ;
-
-
timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(2) ) ;
-
-
timer_.async_wait ( boost::bind(&compiler::link_bind_step , this )) ;
-
}
-
-
void link_bind_step ()
-
{
-
std::cout << "linking and binding target files" << std::endl ;
-
-
timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(2)) ;
-
-
timer_.async_wait ( boost::bind( &compiler::run_program_step , this )) ;
-
}
-
-
void run_program_step ()
-
{
-
timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(2)) ;
-
// 上面的这个用来延迟截止时间的方法调不调用都可以,因为这个 run_program_step 方法已经是异步操作链中的最后的一个操作了
-
// 2s 过后将会退出程序
-
std::cout << "executing executable binary file " << std::endl ;
-
-
std::cout << " time end " << std::endl ;
-
}
-
private :
-
int counter_ ;
-
boost::asio::deadline_timer timer_ ;
-
} ;
-
-
int main ()
-
{
-
boost::asio::io_service io ;
-
compiler c(io ) ;
-
-
io.run () ;
-
return 0 ;
-
}
end
阅读(1601) | 评论(0) | 转发(0) |