// TestASIO.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>
#include <boost/thread/thread.hpp>// 一般的数据传输过程需要通过函数的返回值来判断数据传输是否成功。Boost Asio将数据传输分为两个独立的步骤:
//
// 采用异步任务的方式开始数据传输。
// 将传输结果回掉通知调用端void myPrint(const boost::system::error_code& /*e*/)
{std::cout << "[" << std::this_thread::get_id() << "]:Hello World!\n";
}//参数绑定
void myPrint_new(const boost::system::error_code& /*e*/,boost::asio::steady_timer* t, int* count)
{if (*count < 5){std::cout << *count << std::endl;++(*count);//将计时器的到期时间从之前的到期时间移动一秒。//通过相对于旧的过期时间计算新的过期时间,我们可以确保计时器不会因为处理处理程序的任何延迟而偏离整秒标记。t->expires_at(t->expiry() + boost::asio::chrono::seconds(1));t->async_wait(boost::bind(myPrint_new, boost::asio::placeholders::error, t, count));}
}//使用成员函数作为处理程序
//我们没有像在前面的教程程序中那样定义一个空闲函数print作为回调处理程序,而是定义了一个名为printer的类。
//该类的构造函数将引用io_context对象,并在初始化timer_成员时使用它。用来关闭程序的计数器现在也是类的成员。
class printer
{
public:printer(boost::asio::io_context& io) : timer_(io, boost::asio::chrono::seconds(1)), count_(0) {timer_.async_wait(boost::bind(&printer::print, this));}~printer() {std::cout << "Final count is " << count_ << std::endl;}
protected:void print(){if (count_ < 5){std::cout << count_ << std::endl;++count_;timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1));timer_.async_wait(boost::bind(&printer::print, this));}}private:boost::asio::steady_timer timer_;int count_;
};//在多线程程序中同步处理器
class PrintNew
{
public:PrintNew(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){timer1_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&PrintNew::print1, this)));timer2_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&PrintNew::print2, this)));}~PrintNew(){std::cout << "Final count is " << count_ << std::endl;}protected:void print1(){if (count_ < 10){std::cout << "Timer 1: " << count_ << std::endl;++count_;timer1_.expires_at(timer1_.expiry() + boost::asio::chrono::seconds(1));timer1_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&PrintNew::print1, this)));}}void print2(){if (count_ < 10){std::cout << "Timer 2: " << count_ << std::endl;++count_;timer2_.expires_at(timer2_.expiry() + boost::asio::chrono::seconds(1));timer2_.async_wait(boost::asio::bind_executor(strand_, boost::bind(&PrintNew::print2, this)));}}private:boost::asio::strand<boost::asio::io_context::executor_type> strand_;boost::asio::steady_timer timer1_;boost::asio::steady_timer timer2_;int count_;
};int main()
{
//     boost::asio::io_context io;
//     boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
//     t.wait();//     boost::asio::io_context io;
//     boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
//     //使用ASIO的异步函数,需要一个回调函数,将在异步操作完成时被调用
//     //myPrint将在异步等待结束后调用
//     t.async_wait(&myPrint);
//     std::cout << "[" << std::this_thread::get_id() << "]:Main Finish!\n";
//     //ASIO框架下,只有调用了io_context::run()函数,异步等待的回调才会被调用
//     //当计时器过期或者异步回调完成时,run函数才会返回
//     io.run();//     boost::asio::io_context io;
//     int iCount = 0;
//     boost::asio::steady_timer tm(io, boost::asio::chrono::seconds(1));
//     tm.async_wait(boost::bind(myPrint_new, boost::asio::placeholders::error, &tm, &iCount));
//     io.run();
//     std::cout << "[" << std::this_thread::get_id() << "]:Final count is " << iCount << std::endl;//     boost::asio::io_context io;
//     printer p(io);
//     io.run();boost::asio::io_context io;PrintNew p(io);boost::thread t(boost::bind(&boost::asio::io_context::run, &io));io.run();t.join();return 0;
}

基于Boost.Asio的异步编程相关推荐

  1. 基于boost asio实现的支持ssl的通用socket框架

    情景分析    现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下   ...

  2. 基于boost asio实现sync tcp server通信

    文章目录 一.功能介绍 二.string类型数据交互 2.1 程序源码 2.2 编译&&执行 2.3 程序执行结果 三.byte类型数据交互 3.1 程序源码 3.2 编译&& ...

  3. Boost:基于boost::asio的延迟udp服务器测试程序

    Boost:基于boost::asio的延迟udp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟udp服务器测 ...

  4. Boost:基于boost::asio的延迟tcp服务器测试程序

    Boost:基于boost::asio的延迟tcp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟tcp服务器测 ...

  5. Boost:基于boost::asio单元测试的测试程序

    Boost:基于boost::asio单元测试的测试程序 实现功能 C++实现代码 实现功能 boost::asio模块,基于boost::asio单元测试的测试程序 C++实现代码 #ifndef ...

  6. Boost:基于boost::asio模块引用计数程序

    Boost:基于boost::asio模块引用计数程序 实现功能 C++实现代码 实现功能 基于boost::asio模块引用计数程序 C++实现代码 #include <boost/asio. ...

  7. Boost.Asio的网络编程

    简介 这篇笔记是boost::asio的概览, 主要说明了boost的进行CS结构编程的基本步骤. 在网络编程中, 又很多需要IO的操作. 一种是使用Linux的原生C语言API, Linux的核心编 ...

  8. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...

  9. 对Boost.Asio中异步事件循环的理解

    Boost.Asio是一个异步编程的网络框架, 核心的优势在于IO操作的异步调用. 异步调用时, 会用到boost::asio::io_context::run()函数, 这个函数表示启动一个IO的异 ...

  10. 基于Boost.Asio的异步通信服务器设计与开发

     boost::asio 通讯服务器实践 1. 开发环境搭建 1.1. Asio准备 万事开头难.对于一个C++的陌生者,编译一个开源的代码并不是一件轻松愉快的事情.为使大家在审阅和检测本代码可使 ...

最新文章

  1. win10搭建python环境_win10系统搭建python环境的还原方法
  2. Java黑皮书课后题第10章:**10.23(实现String类)在Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString2)
  3. php session mysql_php session mysql存储
  4. 转:如何用gcc编译生成动态链接库*.so文件 动态库
  5. 想和人脑一样智能? IBM 的芯片级模仿才是关键
  6. ava集合---ArrayList的实现原理
  7. ffmpeg检测文件是否损坏_[音视频] 下载M3U8加密视频文件
  8. oracle rac vip不通,Oracle RAC 中vip网关引起错误的解决
  9. BrightHouse存储引擎
  10. 619. Biggest Single Number
  11. 日置BT3562无法开机怎么办,日常如何进行保养
  12. 操作系统-3.假设某多道程序设计系统中有供用户使用的内存100KB,打印机1台。系统采用可变分区方式管理内存:对打印机采用静态分配,并假设输入输出操作的时间忽略不计;采用最短剩余时间优先的进程调度算法
  13. MongoDB UTC时间问题
  14. 报错:“export ‘default‘ (imported as ‘mui)‘ was not fount in ‘../lib/mui/js/mui-min.js‘
  15. DataView对象
  16. python微妙级sleep
  17. 王坚:阿里巴巴为什么会“去IOE”(一) | 《商业价值》杂志
  18. c语言课程设计之黑白棋游戏,c语言课程设计黑白棋游戏.doc
  19. impala 源码级别优化
  20. 数据盘html,手把手教你如何刻录数据光盘

热门文章

  1. 投票丨鹿晗关晓彤曝光恋情 是如何搞垮新浪服务器的
  2. cx_Oracle报错“DPI-1047: Cannot locate a 64-bit Oracle Client library”
  3. SoftMaker Office 2021中文版软件介绍-Office办公套件媲美Microsoft Office
  4. 杨韬的Markdown自定义CSS样式
  5. 剑指Offer-46:把数字翻译成字符串
  6. 【翠花学Vue】每日打卡——vue打卡1
  7. WordPress系列教程(一)----WordPress环境准备与安装
  8. 第6次课程作业—张欣
  9. 有一部电影用计算机回到未来,《复联4》调侃《回到未来》,1985年的这部穿越片,到底讲了什么...
  10. 李飞飞学生新作:利用场景图生成图像