前言

上一篇简单介绍了Asio的同步和异步原理图,这篇接着介绍Asio的简单示例。

使用成员函数作为回调函数

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>class printer
{public://初始化I\O对象printer(boost::asio::io_context& io): timer_(io, boost::asio::chrono::seconds(1)),count_(0){//调用I\O对象方法,并绑定回调函数和参数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));//调用I\O对象的方法,同时再次绑定回调函数和参数timer_.async_wait(boost::bind(&printer::print, this));}}private:boost::asio::steady_timer timer_;int count_;
};int main()
{// I\O 执行上下文boost::asio::io_context io;// 对象实例printer p(io);//调用I\O执行上下文的检索函数io.run();return 0;
}

可以看到回调函数并没有使用静态全局函数而是成员函数,同时回调函数的参数是this指针。

这里涉及到C++的内存分布,类的成员函数都是在一块内存中,每实例化一个对象并不需要分配内存给函数,而是复用类的成员函数,区别在于类的成员函数有一个隐藏的参数(对象指针)。类的成员函数会根据对象指针自动处理函数。

多线程回调函数

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind/bind.hpp>class printer
{public://初始化两个I\O对象和strand// strand绑定I\O上下文,保证回调函数一定处理完才会进行下一个回调函数处理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){//调用I\O对象的方法,并绑定回调函数和参数timer1_.async_wait(boost::asio::bind_executor(strand_,boost::bind(&printer::print1, this)));//调用I\O对象的方法,并绑定回调函数和参数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));//再次调用I\O对象函数,并绑定回调函数和参数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));//再次调用I\O对象函数,并绑定回调函数和参数timer2_.async_wait(boost::asio::bind_executor(strand_,boost::bind(&printer::print2, this)));}}private://保证在上一个事件处理函数处理完成之前是没法执行下一个事件处理函数boost::asio::strand<boost::asio::io_context::executor_type> strand_;//strandboost::asio::steady_timer timer1_;//I\O对象boost::asio::steady_timer timer2_;//I\O对象int count_;
};int main()
{//I\O 执行上下文boost::asio::io_context io;// 实例化对象printer p(io);//使用boost线程,来运行I\O执行上下文检索函数boost::thread t(boost::bind(&boost::asio::io_context::run, &io));//等待线程结束t.detach();std::cout << "aaaa"<< std::endl;//防止主线程结束while (1){Sleep(500);}return 0;
}

结束

Asio的简单应用就到这里,下篇介绍Asio实现网络通信。

boost入门(三):Asio简单示例相关推荐

  1. python的简单编程-python入门脚本的简单示例

    编程之家收集整理的这篇文章主要介绍了python入门脚本的简单示例,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧. ...

  2. boost asio 简单示例

    客户端: #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #incl ...

  3. PyTorch入门(三)--实现简单图像分类器

    实现简单图像分类器 1. 数据加载 1.1 常用公共数据集加载 1.2 私人数据集加载方法 2. 定义神经网络 3. 定义权值更新与损失函数 4. 训练与测试神经网络 5. 神经网络的保存与载入 本篇 ...

  4. JAVA入门[6]-Mybatis简单示例

    初次使用Mybatis,先手写一个hello world级别的例子,即根据id查询商品分类详情. 一.建表 create table Category ( Id INT not null, Name ...

  5. SpringBoot入门第一个简单示例

    2019独角兽企业重金招聘Python工程师标准>>> 本示例使用SpringBoot官方的QuickStart程序 详情地址:http://projects.spring.io/s ...

  6. Boost:组合异步操作的简单示例

    Boost:组合异步操作的简单示例 实现功能 C++实现代码 实现功能 boost::asio模块,组合异步操作的简单示例 C++实现代码 #include <boost/asio/io_con ...

  7. python密码登录程序三次_Python实现账号密码输错三次即锁定功能简单示例

    本文实例讲述了Python实现账号密码输错三次即锁定功能.分享给大家供大家参考,具体如下: 初学Python-1 #实现账号输错三次即锁定 user = "hubery" pass ...

  8. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  9. python定时执行脚本_Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...

  10. BOOST使用 proto::extends 扩展终端类型的简单示例

    BOOST使用 proto::extends 扩展终端类型的简单示例 实现功能 C++实现代码 实现功能 BOOST使用 proto::extends 扩展终端类型的简单示例 C++实现代码 #inc ...

最新文章

  1. FPGA 和ASIC开发的区别
  2. 网站权重的提升更需要得到重视
  3. ffmpeg为何用c语言编译,如何使用ffmpeg的c语言sdk实现对文件夹的操作
  4. ListView控件的弧形设计
  5. django1.8读书笔记模版高级进阶
  6. 家里门不小心反锁应该怎么办?
  7. Codeforces Round #568 (Div. 2)A
  8. 《构建之法》8、9、10
  9. 花了很长时间看完了 java编程思想
  10. 计算机应用u盘解释,U盘速度测试和参数解释
  11. python sorted方法
  12. protoc导出时遇到protoc-gen-go unable to determine Go import path解决方法
  13. 中通快递宣布全球发售定价
  14. 普洱机器人编程_普洱机器人视觉效果怎么样?
  15. 爱创课堂每日一题-Javascript垃圾回收方法?
  16. 西门子PLC 以太网通讯
  17. ui(new Ui::MainWindow) 解惑
  18. 好用的IPv6归属地 API
  19. 千万不要尝试波段操作
  20. 堆结构(二) - 左倾堆的原理与实现

热门文章

  1. RPG游戏《黑暗之光》流程介绍与代码分析之(九):技能系统的实现
  2. Linux7网卡绑定后mac一样,如何解决双网卡bond0绑定模式物理成员口的mac地址和bonding接口mac地址不一致......
  3. yii2-jui的基本使用
  4. Windows 已经激活,但是显示副本不是正版的解决办法
  5. 训练集、测试集和验证集的作用
  6. adb命令刷机vivox20_vivo手机如何双清?vivo双wipe刷机教程
  7. 上网日志留存_中国移动5G上网日志留存系统招标:最高投标总限价10亿元
  8. Java POI输出excel单元格画斜线
  9. 服务器系统测试,服务器系统整合测试
  10. opengles之3D模型加载(obj模型文件)