asio

boost::asio序列: 计时器

别说谁变了你拦得住时间么 提交于 2020-04-12 17:02:07
以下两个示例都是使用计时器的例子,超时时长设置为5秒 1. 使用计时器同步等待超时 #include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> int main() { // 如果采用boost旧版本,则: boost::asio::io_service io; boost::asio::io_context io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); // 同步等待 t.wait(); std::cout << "Hello, world!" << std::endl; return 0; } 2. 使用计时器异步等待超时 #include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; } int main() { boost:

boost::asio序列: boost::bind 和 std::bind 和 class member function

一曲冷凌霜 提交于 2020-04-12 16:59:57
1. boost::bind => class member function #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/date_time/posix_time/posix_time.hpp> class printer { public: printer(boost::asio::io_context& 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:

Boost::Asio 序列: 域名解析

被刻印的时光 ゝ 提交于 2020-04-12 16:59:25
// #include <QCoreApplication> /* * ModuleName: Main * Description: Boost::asio::ip::tcp::resolver * Author: hsw * Date: 2020-04-11 * */ #include <iostream> #include <boost/asio.hpp> using boost::asio::ip::udp; using boost::asio::ip::tcp; int main(int argc, char *argv[]) { boost::asio::io_context ioContext; tcp::resolver ioResolver(ioContext); tcp::resolver::query ioQuery(boost::asio::ip::tcp::v4(), "www.cnblogs.com", "https"); boost::system::error_code ec; tcp::resolver::results_type ioResults = ioResolver.resolve(ioQuery, ec); if(ec) { std::cout << "e = " << ec.message() << std::endl; return

# asio run vs poll

和自甴很熟 提交于 2020-04-11 17:38:33
asio run vs poll discussions Using io_service::poll instead of io_service::run is perfectly acceptable. The difference is explained in the documentation The poll() function may also be used to dispatch ready handlers, but without blocking. Note that io_service::run will block if there's any work left in the queue The work class is used to inform the io_service when work starts and finishes. This ensures that the io_service object's run() function will not exit while work is underway, and that it does exit when there is no unfinished work remaining. whereas io_service::poll does not exhibit

boost::asio序列2:execution_context

梦想与她 提交于 2020-04-07 05:35:26
class io_context : public execution_context execution_context是io_context的基类,表示函数对象执行的上下文。 execution_context代表函数对象执行的位置。 execution_context和services (1) execution_context实现一个可拓展的,类型安全的,services多态集合,通过service type 索引。 (2) services 用于管理用于跨execution_context共享的资源。例如,timers可能的通过单个timer队列实现,该队列被保存在一个service中 通过模板函数use_service(), add_service(), has_service()访问exection_context对象的services 调用use_service<Service>(),类型参数Service用于选择service使得全部的成员变得可使用。 如果service在execution_context中不存在,则类型为Service的对象将被创建并且加入到exection_context中。通过has<service<Service>()检查exection_context是否实现对应的Service。 Service对象可以通过显示调用模板函数add

高性能I/O设计模式Reactor和Proactor

非 Y 不嫁゛ 提交于 2020-03-19 02:44:53
   一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模 式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。 在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。 而 在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包 括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后 将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实 现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。 举个例子

Asio的Buffer应该如何使用

给你一囗甜甜゛ 提交于 2020-02-28 21:18:13
Asio的Buffer应该如何使用 文章目录 Asio的Buffer应该如何使用 什么是asio::buffer asio::const_buffer和asio::mutable_buffer asio::buffer使用方法 例子 什么是asio::buffer asio::buffer并不是真正的缓冲区,想要获得缓冲区必须传入一段内存,比如st::vector<>,char[],std::string等。而asio::buffer负责管理这段内存,特别注意对于异步API内存在使用时必须有效。 asio::const_buffer和asio::mutable_buffer 构造函数不同 const_buffer不可修改,初始化是什么使用socket发送时就会发送什么,比如使用st::vector初始化,虽然vector的内容可以修改,但是对asio::buffer来说不起作用 asio::buffer使用方法 简单的方法就是在session类里申请一片内存(或全局内存),发送时使用asio::buffer包装 BufferSequence 使用内存池 例子 在session类里申请一片内存 class session : public std : : enable_shared_from_this < session > { public : session ( tcp : :

Boost.ASIO简要分析-1 初窥

依然范特西╮ 提交于 2020-02-24 17:26:52
Boost.Asio是一个主要用于网络及底层I/O编程的跨平台C++库。 1. 初窥 Boost.Asio支持对I/O对象进行同步及异步操作。 1.1 同步操作 同步操作的事件顺序如下图所示: 1) 调用者调用I/O对象的connect函数开始连接操作,socket.connect(server_endpoint); 2) I/O对象将连接请求传递给io_service; 3) io_service调用操作系统函数; 4) 操作系统返回结果给io_service; 5) io_service将结果以boost::system::error_code类型传递给I/O对象; 6) I/O对象将结果告诉调用者。 需要注意的是如果用户在第1步中使用socket.connect(server_endpoint)这个函数开始连接操作,那么如果连接过程中出现错误,I/O对象将以抛异常的行为来告诉你出错了(因为它想告诉你出错了,又没有可接收错误的参数),所以没养成写try/catch习惯的朋友需要注意了^_^。当然,我们可以使用socket.connect(server_endpoint, ec) 这个函数就可以避免未捕获异常而导致的程序崩溃问题。变量ec是boost::system::error_code类型,用于接收错误信息。 从上述流程我们可以看出,步骤1->2->3->4->5-

Boost::Asio入门剖析

时光总嘲笑我的痴心妄想 提交于 2020-02-24 17:26:21
Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。 作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子 你的程序需要一个io_service对象,io_service把你的程序和操作系统I/O设备链接起来。 boost::asio::io_service io_service; 你的程序需要一个I/O对象来执行I/O操作,比如tcp socket boost::asio::ip::tcp::socket socket(io_service); 执行一个同步的连接操作时,会顺序发生下列事件 1.你的程序通过调用I/O对象来启动连接操作 socket.connect(server_endpoint); 2.I/O对象转发请求给io_service 3.io_service通知操作系统执行连接操作 4.操作系统把连接操作的结果返回给io_service 5.io_service把操作的错误转化成boost::system::error_code,一个error_code可能同特定的值进行比较,或者作为一个boolen(false结果意味着没有错误发生),结果被传送会I/O对象。 6.如果操作失败I

Adobe Audio 分轨录音教程(需要KX,Live机架)

时光怂恿深爱的人放手 提交于 2020-02-16 04:43:14
一、需要的硬件和软件 1. 创新5.1声卡或7.1声卡; 2. 已安装KX驱动和Live机架,经过测试安装后需要重启电脑才能生效。 3. 已安装Adobe Audition 3.0 二、测试环境 WIN7 64bit 三、分轨录音的步骤: 1. 首先启动KX和Live机架 2. kx连线设置 打开KX的数字信号处理器。通常都是把asio14/15 作为麦克风输入的线路(其他线路同理)。 我们需要做的就是将要录制的音源分轨连接到Asio的不同端子上,然后通过Au3.0接收Asio各个轨道的声音进行分轨录制。 如下图所示,我们将混响效果连接到 Asio 13/14 端子上,酷狗音乐连接到 Asio的 12/13端子上,这样就实现了我们要分轨的音源分开输入到了Asio中 3. AU 3.0中进行设置 连接好了Asio之后,我们就可以进入到 AU 3.0中进行设置 ①设置录制音频设备为kx Asio,首先打开Au 3.0 点击菜单栏中的“编辑”——“音频硬件设置”——在音频设备中选择“kx ASIO kx Generic (c000)” 确定即可。 ② 将vst效果添加到au 3.0 中。 切换到 编辑状态——点击菜单栏中的“效果”——“添加与移除vst目录”,将默认的文件夹移除,点击添加,找到我们安装机架时候的“vst插件”文件夹,将效果全选(你也可以只选择自己常用的效果)