boost入门(三):Asio简单示例

boost入门(三):Asio简单示例

2023年8月2日发(作者:)

boost⼊门(三):Asio简单⽰例前⾔上⼀篇简单介绍了Asio的同步和异步原理图,这篇接着介绍Asio的简单⽰例。使⽤成员函数作为回调函数#include #include #include class printer{public: //初始化IO对象 printer(boost::asio::io_context& io) : timer_(io, boost::asio::chrono::seconds(1)), count_(0) { //调⽤IO对象⽅法,并绑定回调函数和参数 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_; //过期时间减少1秒 timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1)); //调⽤IO对象的⽅法,同时再次绑定回调函数和参数 timer_.async_wait(boost::bind(&printer::print, this)); } }private: boost::asio::steady_timer timer_; int count_;};int main(){ // IO

执⾏上下⽂ boost::asio::io_context io; //

对象实例 printer p(io); //调⽤IO执⾏上下⽂的检索函数 (); return 0;}可以看到回调函数并没有使⽤静态全局函数⽽是成员函数,同时回调函数的参数是this指针。这⾥涉及到C++的内存分布,类的成员函数都是在⼀块内存中,每实例化⼀个对象并不需要分配内存给函数,⽽是复⽤类的成员函数,区别在于类的成员函数有⼀个隐藏的参数(对象指针)。类的成员函数会根据对象指针⾃动处理函数。多线程回调函数#include #include #include #include class printer{public: //初始化两个IO对象和strand // strand绑定IO上下⽂,保证回调函数⼀定处理完才会进⾏下⼀个回调函数处理 printer(boost::asio::io_context& io) : strand_(boost::asio::make_strand(io)), timer1_(io, boost::asio::chrono::seconds(1)), timer2_(io, boost::asio::chrono::seconds(1)), count_(0) { //调⽤IO对象的⽅法,并绑定回调函数和参数 timer1_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&printer::print1, this))); //调⽤IO对象的⽅法,并绑定回调函数和参数 timer2_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&printer::print2, this))); } ~printer() { std::cout << "Final count is " << count_ << std::endl; } void print1() { if (count_ < 10) { std::cout << "Timer 1: " << count_ << std::endl; ++count_; //失效时间-1秒 timer1_.expires_at(timer1_.expiry() + boost::asio::chrono::seconds(1)); //再次调⽤IO对象函数,并绑定回调函数和参数 timer1_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&printer::print1, this))); } } void print2() { if (count_ < 10) { std::cout << "Timer 2: " << count_ << std::endl; ++count_; //失效时间-1秒 timer2_.expires_at(timer2_.expiry() + boost::asio::chrono::seconds(1)); //再次调⽤IO对象函数,并绑定回调函数和参数 timer2_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&printer::print2, this))); } }private: //保证在上⼀个事件处理函数处理完成之前是没法执⾏下⼀个事件处理函数 boost::asio::strand strand_;//strand boost::asio::steady_timer timer1_;//IO对象 boost::asio::steady_timer timer2_;//IO对象 int count_;};int main(){ //IO

执⾏上下⽂ boost::asio::io_context io; //

实例化对象 printer p(io); //使⽤boost线程,来运⾏IO执⾏上下⽂检索函数 boost::thread t(boost::bind(&boost::asio::io_context::run, &io)); //等待线程结束 (); std::cout << "aaaa"<< std::endl; //防⽌主线程结束 while (1) { Sleep(500); } return 0;}结束Asio的简单应⽤就到这⾥,下篇介绍Asio实现⽹络通信。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690907303a460364.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信