Asio官方文档 的非官方中文翻译 (Tutorial-0-3)

自己翻译的 肯定会有错误\问题哈

Timer.4 - Using a member function as a handler
https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/tutorial/tuttimer4.html


Timer.4 - Using a member function as a handler

本例我们将会看到如何将一个类的成员函数作为回调执行函数.这次的程序应该跟上一篇教程 Timer.3中的程序执行结果一样.

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>

区别于我们之前把一个自由函数print作为回调处理函数的做法,这次我们定义了一个叫做printer的类.

class printer
{
public:

这个类的构造函数传一个io_context的引用进来, 类成员timer_初始化的时候用.之前用来控制停止的计数器count现在也作为类的成员变量了.

printer(boost::asio::io_context& io)
	: timer_(io, boost::asio::chrono::seconds(1),
	  count_(0)
{

boost::bind()函数用在类的成员函数上也可以像自由函数一样正常工作.不过所有的类的非静态成员函数都有一个隐含的 this 形参,所以我们要把这个this用bind绑到成员函数上.跟上篇教程Timer.3里说的一样,boost::bind() 把我们的回调函数转换为一个可以被async_wait接受的函数.

你可能会注意到,boost::asio::placeholders:error 的占位符在这里没有,因为成员print根本嫩就没有这个形参.

	timer_.async_wait(boost::bind(&printer::print, this));
	}

在下面的构造函数中,我们会把计数器的最终值给打印出来.

~printer()
{
	std::cout << "Final count is " << count_ << std::endl;
}

至于这个print成员函数就跟我们上一篇写的print函数差不多了,只不过改参数里的数据现在换成改类的成员变量了.

	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_;
};

main函数比之前简单多了,现在只要在io_context之前定义一个printer对象就行了.

int main()
{
	boost::asio::io_context io;
	printer p(io);
	io.run();

	return 0;
}

再把代码整体再回顾一遍

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>

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;
	}

	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_;
};

int main()
{
	boost::asio::io_context io;
	printer p(io);
	io.run();
	
	return 0;
}

自己再试图改成只使用boost::asio

#include <boost/asio.hpp>
#include <iostream>
#include <functional>
#include <chrono>
//#include <system_error>

using namespace std::chrono_literals;
namespace asio = boost::asio;

class printer
{
public:
	printer(boost::asio::io_context& io)
		: timer_(io, 1s),
		  count_(0)
  	{
  		timer_.async_(std::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_.expiry() + 1s);
			timer_.async_wait(std::bind(&printer::print, this));
		}
	}
private:
	boost::asio::steady_timer timer_;
	int count_;
}

int main()
{
	boost::asio::io_context io;
	printer p(io);
	io.run();

	return 0;
}

Timer.4 - Using a member function as a handler
https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/tutorial/tuttimer4.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值