boost::asio::io_context, boost::asio::steady_timer定时器

本文详细介绍了Asio库中的asio::steady_timer定时器的使用,包括如何与asio::io_context关联、设置定时器过期时间、异步等待操作以及在多线程场景下的应用。特别强调了asio::run的行为和C++11lambda表达式的使用优化。
摘要由CSDN通过智能技术生成

asio定时器深度探析_expires_after-CSDN博客

asio::io_context是Asio库中的一个I/O执行环境,而asio::steady_timer是一个与asio::io_context关联的定时器,可以用来在给定的时间点执行一个函数或者是在一个固定的时间间隔后执行一个函数。

以下是一个创建asio::steady_timer的例子

#include <iostream>
#include <chrono>
#include <asio.hpp>
 
int main()
{
    asio::io_context io_context;
 
    asio::steady_timer timer(io_context, std::chrono::seconds(5));
 
    timer.async_wait([](const asio::error_code& error) 
    {
        if (!error)
        {
            std::cout << "Timer expired." << std::endl;
        }
    });
 
    io_context.run();
 
    return 0;
}

在这个例子中,我们创建了一个asio::io_context,然后创建了一个asio::steady_timer,并设置了它在5秒后过期。然后我们注册了一个异步等待操作,并在定时器到期时会打印一条消息。最后,我们运行I/O执行环境。

注意,asio::steady_timer是与特定的I/O执行环境(asio::io_context)关联的,因此在创建asio::steady_timer时需要传入一个asio::io_context

另外,asio::steady_timer的构造函数接受一个时间参数,这个参数表示定时器何时应该过期。在这个例子中,我们使用了std::chrono::seconds(5)来指定5秒后过期。

最后,timer.async_wait函数用于注册一个异步等待操作,当定时器到期时,给定的回调函数会被调用。在回调函数中,我们检查错误代码,如果没有错误,则输出一条消息。

io_context.run()是执行异步操作所必需的,它会阻塞直到所有注册的异步操作都完成。

#include <iostream>  
#include <asio.hpp>
#include <thread>
using namespace std;

struct logic
{
	int count = 0;
};
class c_timer
{
public:
	c_timer(asio::io_context &io):v_io(io),v_t(io)
	{
		v_t.expires_after(asio::chrono::seconds(5));
	}
	void start(logic &gc)
	{
		v_t.async_wait([this,&gc](const std::error_code &ec) {
			cout << "this is timer here" << endl;
			gc.count++;
			v_t.expires_after(asio::chrono::seconds(5));
			start(gc);
		});
	}
private:
	asio::io_context &v_io;
	asio::steady_timer v_t;
};


int main()
{
	logic lg;
	thread th([&lg]() {
		asio::io_context io;
		c_timer timer(io);
		timer.start(lg);
		io.run();
		return 0;
	});

	while (1)
	{
		cout << "the count is " << lg.count<<endl;
		std::this_thread::sleep_for(std::chrono::seconds(5));
	}
}

定时器总结

1 、asio.run并非一直阻塞,而是根据用户需求来阻塞
2 、多使用c++11 lamba来使用函数,更为简便
3、利用线程和定时器结合是一个很好的选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值